Another part of the policy is that the heap is shrunk if the
throughput goal and the pause time goal are being
met. It's a slower process than just enforcing MaxHeapFreeRatio
and requires a number of GC's (that is, the heap would be
shrunk down a percentage at each GC).

GC usually happens only as needed. So, after the application goes idle, GC
does not probably happen. The next GC happens only after the application
goes active again. Assuming that, there aren't many chances to shrink the
heap (maybe only one). If the application calls System.gc() right before
going idle, that may be the only chance. In such cases, the slower process
may not work very well.

We would
need to change the UseAdaptiveSizePolicy to do something like

OK. I think the latter may be able to shrink the heap more aggressively.

Do you think the free ratio-based shrinking should happen only when the
throughput goal is met? Using the above scenario, when the application is
working hard (and perhaps GC is working hard as well) and goes idle next
moment, the average throughput at the time of the phase change may not be
good enough for the goal to be met (hence no shrinking).