Это ошибка в JDK 8.
MaxHeapSize
определяется в источниках HotSpot как uintx
, что означает 64-битное целое число без знака.
В JDK 8 формат формат для печати значений флага uintx
равен "%-16lu"
, который обрабатывает ввод как unsigned long
.
Однако размер C ++ unsigned long
отличается на Windows и Unix:
- Большинство систем, подобных Unix, являются LP64, где размер
unsigned long
равен 64 битам. - Visual C ++ на Windows - это LLP64, где размер
unsigned long
составляет 32 бита.
Итак, JDK 8 на Windows печатает только младшие 32 бита флагов uintx
. Вот почему, если MaxHeapSize
точно кратно 4 ГиБ, вы увидите uintx MaxHeapSize := 0
. Это просто ошибка печати; фактический максимальный размер кучи правильный.
Ошибка была исправлена в JDK 9 как часть JDK-8042893 change:
} else if (is_uintx()) {
- st->print("%-16lu", get_uintx());
+ st->print(UINTX_FORMAT_W(-16), get_uintx());