我在这里还看到了其他问题,例如:How is the default max Java heap size determined?和Understanding java heap
我运行命令以查看堆大小java -XX:+PrintFlagsFinal -version
,并获得MaxHeapSize的输出:
uintx MaxHeapSize := 0 {product}
这是什么意思?
答案 0 :(得分:5)
这是JDK 8中的错误。
MaxHeapSize
在HotSpot源中为uintx
的{{3}},代表64位无符号整数。
在JDK 8中,用于打印uintx
标志值的defined是"%-16lu"
,它将输入视为unsigned long
。
但是,在Windows和Unix上,C ++ unsigned long
format的大小:
unsigned long
的大小为64位。unsigned long
的大小为32位。因此,Windows上的JDK 8仅打印uintx
标志的低32位。因此,如果MaxHeapSize
是4 GiB的精确倍数,则会看到uintx MaxHeapSize := 0
。这只是打印错误。实际的最大堆大小是正确的。
作为differs更改的一部分,该错误已在JDK 9中修复:
} else if (is_uintx()) {
- st->print("%-16lu", get_uintx());
+ st->print(UINTX_FORMAT_W(-16), get_uintx());