我在这里看到了其他问题,例如:How is the default max Java heap size determined?和 Understanding java heap
我运行命令以查看我的堆大小 java -XX:+PrintFlagsFinal -version
并获得 MaxHeapSize 的输出:
uintx MaxHeapSize := 0 {product}
这是什么意思?
最佳答案
这是 JDK 8 中的错误。
MaxHeapSize
是 defined在 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/