JVM中的MaxHeapSize值不一致問題
[[email protected] ~]# java -XX:+PrintFlagsFinal -version |grep :
uintx InitialHeapSize := 258689024 {product}
uintx MaxHeapSize := 4139778048 {product}
bool PrintFlagsFinal := true {product}
bool UseCompressedOops := true {lp64_product}
bool UseParallelGC := true {product}
第三列”=”表示第四列是引數的預設值,而”:=” 表明了引數被使用者或者JVM賦值了。
如果執行 -XX:+PrintCommandLineFlags, 能看到 :
[
-XX:InitialHeapSize=258689024 -XX:MaxHeapSize=4139024384 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseParallelGC
你發現了嗎?兩個MaxHeapSize值不相等, 為什麼?
實際的堆大小和使用者在命令列指定的大小不一致,是由於校正機制和就近取整
預設情況下,堆是2MB對齊的,也就是說堆的最小分配單元是2MB
來自 -XX:+PrintCommandLineFlags 的 4139024384 經過2MB校正並向上取整後 變為 來自 -XX:+PrintFlagsFinal的4139778048 這是最終的堆大小 .
因為 4139024384 不是 2M對齊的:4139024384 / (2*1024*1024) = 1973.640625. 向上取整後變成1974,所以 4139778048 / (2*1024*1024) = 1974
可以得出最終堆大小為4139778048,和-XX:+PrintFlagsFinal的4139778048一致