I gave an example. Go allocate 8 gigs. Then get it garbage collected. Why is JVM still allocating 8 gigs?
Furthermore, collection time (for moving collectors) is a function of the liveset, not the # of dead objects.
> java -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 test.java
used=7640 MB, committed=7668 MB, max=8192 MB
used=4 MB, committed=20 MB, max=8192 MB
used=3 MB, committed=8 MB, max=8192 MB
used=3 MB, committed=8 MB, max=8192 MB
The RSS drops from ~8GB to 8 MB.