java - JVM 最大堆大小 := 0 - what does this mean?

标签 java jvm

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

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

uintx MaxHeapSize := 0 {product}

这是什么意思?

最佳答案

这是 JDK 8 中的错误。

MaxHeapSizedefined在 HotSpot 源中为 uintx,代表 64 位无符号整数。

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

但是,C++ unsigned long 的大小 differs在 Windows 和 Unix 上:

  • 大多数类 Unix 系统都是 LP64,其中 unsigned long 的大小是 64 位。
  • Windows 上的 Visual C++ 是 LLP64,其中 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());

关于java - JVM 最大堆大小 := 0 - what does this mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63292471/

相关文章:

java - 迭代参数化列表(原始列表类型分配后)

java - IBM JVM 类加载器如何保存类?

Java CMS GC : can a minor GC occur between final remark and concurrent sweep?

ubuntu - Grails 无法在 Ubuntu 上运行

java - jsch & nohup - 程序没有启动

java - 将数组中的每个其他值分配给第二个数组中的相应值

java - 在面板中显示 ArrayList

java - 如何填写方法 public boolean checkAnswer(String response)?

java - 如果 java.lang.OutOfMemoryError 即将发生,请执行

java - 在 Windows 7 上,Java JVM 如何设置 "user.home"系统属性?