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());
我在这里看到了其他问题,例如: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());