In this short article, we're going to see the difference between various memory size metrics in the JVM.
First, we'll talk about how adaptive sizing works, and then we'll evaluate the difference between max, used, and committed sizes.
2. Max Size and Adaptive Sizing
Two values control the size of the JVM heap: one initial value specified via the -Xms flag and another maximum value controlled by the -Xmx tuning flag.
If we don't specify these flags, then the JVM will choose default values for them. These default values depend on the underlying OS, amount of available RAM, and, of course, the JVM implementation itself:
Regardless of the actual size and default values, the heap size starts with an initial size. As we allocate more objects, the heap size may grow to accommodate for that. The heap size, however, can't go beyond the maximum heap size.
Put simply, the max heap size is the size specified via the -Xmx flag. Also, when we don't explicitly specify the -Xmx, the JVM calculates a default max size.
3. Used Size
Now, let's suppose we allocated a few objects since the program started. The heap size may grow a bit to accommodate for new objects:
The used space is the amount of memory that is currently occupied by Java objects. It's always less than or equal to the max size.
4. Committed Size
The committed size is the amount of memory guaranteed to be available for use by the Java virtual machine. The committed memory size is always greater than or equal to the used size.
In this short article, we saw the difference between max, used, and committed heap size.