Получить доступ

Почему увеличение кучи с 30 ГБ до 33 ГБ может уменьшить объём фактически доступной памяти?

SeniorJVM и сборка мусора
Коротко

Около 32 ГБ отключаются compressed oops: ссылки занимают 8 байт вместо 4. В приложениях с множеством мелких объектов полезного места становится меньше, чем было на 30 ГБ.

  • Сжатие: адрес хранится в единицах выравнивания 8 байт — 2³² × 8 = 32 ГБ
  • Точный порог чуть ниже 32 ГБ, проверить: -XX:+PrintFlagsFinal | grep UseCompressedOops
  • Либо держать кучу ниже порога, либо сразу брать заметно больше (48 ГБ+)

А ещё Увеличение выравнивания (ObjectAlignmentInBytes=16) поднимает порог до 64 ГБ

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Приём со сжатыми указателями работает так: адреса хранятся не байтами, а единицами выравнивания (по умолчанию 8 байт), поэтому 32-битного значения хватает для адресации примерно 32 ГБ. Как только куча превышает этот предел, JVM переходит на полноразмерные ссылки, и приложения с большим числом мелких объектов и ссылок теряют заметную долю памяти — на практике прирост кучи может обернуться чистым проигрышем. Практическая рекомендация известна: либо оставаться заметно ниже порога, либо переходить сразу к существенно большему размеру, чтобы прирост перекрыл потери. Заодно полезно помнить об устройстве объекта — заголовок с mark word и указателем на класс плюс выравнивание, из-за которого даже пустой объект занимает не ноль байт.

Что хотят услышать

  • Механизм сжатых ссылок.
  • Порог и последствия.

Частые ошибки

  • Наращивать кучу до значения чуть выше порога.
  • Считать, что память процесса линейно следует за -Xmx.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Отключаются compressed oops: ссылки перестают храниться в сжатом 32-битном виде и занимают вдвое больше, из-за чего объекты раздуваются
  • ✗Сборщик мусора переключается на менее эффективный алгоритм
  • ✗Metaspace начинает выделяться из кучи
  • ✗Операционная система запрещает выделять больше 32 ГБ одному процессу

Что спросят дальше

  • Из чего состоит заголовок объекта?
  • Как проверить, включены ли compressed oops?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем