Java JVM MaxHeapSize:=0-这意味着什么?

Java JVM MaxHeapSize:=0-这意味着什么?,java,jvm,Java,Jvm,我在这里看到了其他问题,比如:和 我运行命令查看我的堆大小java-XX:+PrintFlagsFinal-version,并获得MaxHeapSize的输出: uintx MaxHeapSize:=0{product} 这是什么意思?这是JDK 8中的一个bug MaxHeapSize作为uintx在热点源代码中,表示64位无符号整数 在JDK 8中,用于打印uintx标志值的值是“%-16lu”,它将输入视为无符号长 但是,Windows和UNIX:C++的代码>未签名的长< /C> >的大

我在这里看到了其他问题,比如:和

我运行命令查看我的堆大小
java-XX:+PrintFlagsFinal-version
,并获得MaxHeapSize的输出:

uintx MaxHeapSize:=0{product}


这是什么意思?

这是JDK 8中的一个bug

MaxHeapSize
作为
uintx
在热点源代码中,表示64位无符号整数

在JDK 8中,用于打印
uintx
标志值的值是
“%-16lu”
,它将输入视为
无符号长

但是,Windows和UNIX:C++的代码>未签名的长< /C> >的大小:

  • 大多数类Unix系统都是LP64,其中
    无符号long
    的大小为64位
  • Windows上的Visual C++是LLP64,其中代码<未签名的长< /C> >为32位。
因此,Windows上的JDK 8只打印32位的
uintx
标志。这就是为什么如果
MaxHeapSize
是4gib的精确倍数,您将看到
uintx MaxHeapSize:=0
。这只是打印错误;实际最大堆大小是正确的

作为变更的一部分,该缺陷在JDK 9中得到了修复:


这意味着,您在Windows上运行64位JDK 8(或更早版本),最大堆大小(-Xmx)是4 GiB的精确倍数。我刚刚通过运行
java-Xmx4g-XX:+printflasfinal-version
验证了这一点,并且可以重现
MaxHeapSize:=0
。你能解释一下为什么会这样吗?
     } else if (is_uintx()) {
-      st->print("%-16lu", get_uintx());
+      st->print(UINTX_FORMAT_W(-16), get_uintx());