已用内存、已提交内存和最大堆内存的差异
2022-08-31 16:27:28
从 MemoryUsage
的 Java Doc,
getUsed 是:
已用内存量(以字节为单位)
getCommitted()
返回提交供 Java 虚拟机使用的内存量(以字节为单位)。此内存量保证供 Java 虚拟机使用。
getMax()
返回可用于内存管理的最大内存量(以字节为单位)。如果未定义最大内存大小,则此方法返回 -1。
如果此内存量大于已提交的内存量,则不能保证此内存量可用于内存管理。即使已用内存量未超过此最大大小,Java 虚拟机也可能无法分配内存。
首先,它们的所有测量单位都是字节used < committed < max
-Xms
used < committed
committed
-Xmx
所以在OP的例子中
这意味着JVM可以在堆中分配高达8.6G的对象,这是有保证的,它不必要求操作系统这样做,因为它已经分配了。如果JVM在某些时候需要比这更多的内存,因为它需要分配更多的对象,并且它不能通过垃圾回收释放任何内存,那么它将在OOM中失败,因为8.6G已经是它允许请求的最大值(我猜因为它是从.-Xmx8600M