If command-line options (-Xmx, -Xms, -XX:MinHeapFreeRation, -XX:MaxHeapFreeRatio) allow, Java will grow and shrink the heap according to the demands of the running application. I've played with these settings and they all seem to do what I expect.
However, there is a complication about which I have been unable to find any information. This involves SoftReferences, of which I have lots, for various caches.
When deciding whether to grow or shrink the heap, does Java include softly-referenced objects in its calculation of required memory?
In other words, will Java clear all my SoftReferences before deciding it has to grow the heap? Or will it grow the heap to avoid having to do so?
Betty Rubble? Well, I would go with Betty... but I'd be thinking of Wilma.