Reference: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8186315
I'm really struggling to find out what MinRAMPercentage does, especially compared to InitialRAMPercentage.
I assumed that InitialRAMPercentage sets the amount of heap at startup, that MinRAMPercentage and MaxRAMPercentage set the bottom and top limit of heap that the JVM is allowed to shrink/grow to.
Apparently that is not the case. When I start a JVM (with UseContainerSupport, having these new memory setting parameters) like so:
java -XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MinRAMPercentage=20.0 -XX:MaxRAMPercentage=80.0 -XX:+PrintFlagsFinal -version | grep Heap
InitialHeap and MaxHeap get set, there is no "Minimum Heap Size" value that I can find; Consequently, that MinRAMPercentage never seems to get used.
Super confused, and apparently, I'm not the only one; the OpenJ9 dudes seem to also not fully parse the intent of these options, as I've gathered here and here. They seem to have opted to simply not implement MinRAMPercentage afaics.
So: What is the real intended usage and effect of setting MinRAMPercentage?
-XX:InitialRAMPercentage
is used to calculate initial heap size whenInitialHeapSize
/-Xms
is not set.It sounds counterintuitive, but both
-XX:MaxRAMPercentage
and-XX:MinRAMPercentage
are used to calculate maximum heap size whenMaxHeapSize
/-Xmx
is not set:For systems with small physical memory
MaxHeapSize
is estimated asOtherwise (non-small physical memory)
MaxHeapSize
is estimated asThe exact formula is a bit more complicated as it also takes other factors into account.
Note: the algorithm for calculating initial and maximum heap size depends on the particular JVM version. The preferred way to control the heap size is to set
Xmx
andXms
explicitly.See also this question.