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

6l7fqoea  于 2022-11-07  发布在  其他
关注(0)|答案(1)|浏览(266)

我在这里看到了其他问题,如:How is the default max Java heap size determined?Understanding java heap的函数
我运行该命令以查看堆大小java -XX:+PrintFlagsFinal -version,并得到MaxHeapSize的输出:
uintx MaxHeapSize := 0 {product}
这是什么意思呢?

pwuypxnk

pwuypxnk1#

这是JDK 8中的一个错误。
MaxHeapSize在HotSpot源代码中定义为uintx,表示64位无符号整数。
在JDK 8中,打印uintx标志值的格式为"%-16lu",它将输入视为unsigned long
但是,C++ unsigned long的大小在Windows和Unix上是不同的:

  • 大多数类Unix系统都是LP 64,其中unsigned long的大小是64位。
  • Windows上的Visual C++是LLP 64,其中unsigned long的大小是32比特。

因此,Windows上的JDK 8只打印uintx标志的低32位。这就是为什么如果MaxHeapSize正好是4 GiB的倍数,您将看到uintx MaxHeapSize := 0。这只是打印错误;实际最大堆大小是正确。
作为JDK-8042893变更的一部分,该错误已在JDK 9中得到修复:

} else if (is_uintx()) {
-      st->print("%-16lu", get_uintx());
+      st->print(UINTX_FORMAT_W(-16), get_uintx());

相关问题