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

kal*_*ien 2 java jvm

我在这里看到了其他问题,例如:默认的最大 Java 堆大小是如何确定的?理解java堆

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

uintx MaxHeapSize := 0 {product}

这是什么意思?

apa*_*gin 5

这是 JDK 8 中的一个错误。

MaxHeapSize限定在热点来源uintx,它表示64位的无符号整数。

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

但是,C++ 的大小在 Windows 和 Unix 上unsigned long 有所不同

  • 大多数类 Unix 系统都是 LP64,其中unsigned long64 位的大小。
  • Windows 上的 Visual C++ 是 LLP64,其中 的大小unsigned long为 32 位。

因此,Windows 上的 JDK 8 仅打印低 32 位uintx标志。这就是为什么 ifMaxHeapSize是 4 GiB 的精确倍数,您会看到uintx MaxHeapSize := 0. 这只是印刷错误;实际的最大堆大小是正确的。

该错误在 JDK 9 中作为JDK-8042893更改的一部分进行了修复

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