JVM MaxHeapSize := 0 - 这是什么意思?

JVM MaxHeapSize := 0 - what does this mean?

我在这里看到了其他问题,例如:How is the default max Java heap size determined? and Understanding java heap

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

uintx MaxHeapSize := 0 {product}

这是什么意思?

这是 JDK 8.

中的错误

MaxHeapSize在HotSpot源中是defineduintx,代表64位无符号整数。

在JDK 8中,用于打印uintx标志值的format"%-16lu",它将输入视为unsigned long

然而,C++ unsigned long differs 在 Windows 和 Unix 上的大小:

  • 大多数 Unix-like 系统是 LP64,其中 unsigned long 的大小是 64 位。
  • Windows 上的 Visual C++ 是 LLP64,其中 unsigned long 的大小是 32 位。

因此,JDK 8 on Windows 仅打印 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());