JVM MaxHeapSize: = 0 - что это значит? - PullRequest
1 голос
/ 07 августа 2020

Я встречал здесь другие вопросы, например: Как определяется максимальный Java размер кучи по умолчанию? и Понимание java куча

Я бегу команда, чтобы увидеть размер моей кучи java -XX:+PrintFlagsFinal -version, и я получаю результат для MaxHeapSize:

uintx MaxHeapSize := 0 {product}

Что это означает?

1 Ответ

4 голосов
/ 08 августа 2020

Это ошибка в 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...