Java applications creates a lot of short lived objects, thats why you see the high heap usage but doesnt means that all is currently referenced, is just garbage.
Garbage Collector runs only when free memory is needed. And since you have a lot of heap memory GC runs when there is no more free memory for new objects which occurs when heap is almost full: about 16GB.
Which JVM are using you?
You can try to use different algorithm of GC (if you are using JDK5 and above).
Try using this argument in your App Server:
You can also specify the number of gc threads:
Please bear in mind this is useful when you have more than one processor in your pc/server.
I've noticed the same. Try MessAdmin to look at your Session size.
I haven't profiled my Session's yet but that is the next step. Would be interesting to know what is being stored as my sessions immediately jump to >70MB when a page using the EntityManager is first hit.