JVM中的MaxHeapSize值不一致问题

来源:互联网 发布:nodejs连接sqlserver 编辑:程序博客网 时间:2024/06/01 07:42
查看MaxHeapSize参数值, 我们可以使用两类JVM选项: -XX:+PrintFlagsFinal 和 -XX:+PrintCommandLineFlags. 下面是使用 -XX:+PrintFlagsFinal参数的输出:
[root@localhost ~]# 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, 能看到 :
[root@localhost ~]# java -XX:+PrintCommandLineFlags -version
-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一致
原创粉丝点击