Почему увеличение кучи с 30 ГБ до 33 ГБ может уменьшить объём фактически доступной памяти?
Около 32 ГБ отключаются compressed oops: ссылки занимают 8 байт вместо 4. В приложениях с множеством мелких объектов полезного места становится меньше, чем было на 30 ГБ.
- Сжатие: адрес хранится в единицах выравнивания 8 байт — 2³² × 8 = 32 ГБ
- Точный порог чуть ниже 32 ГБ, проверить: -XX:+PrintFlagsFinal | grep UseCompressedOops
- Либо держать кучу ниже порога, либо сразу брать заметно больше (48 ГБ+)
А ещё Увеличение выравнивания (ObjectAlignmentInBytes=16) поднимает порог до 64 ГБ
Подробно
Приём со сжатыми указателями работает так: адреса хранятся не байтами, а единицами выравнивания (по умолчанию 8 байт), поэтому 32-битного значения хватает для адресации примерно 32 ГБ. Как только куча превышает этот предел, JVM переходит на полноразмерные ссылки, и приложения с большим числом мелких объектов и ссылок теряют заметную долю памяти — на практике прирост кучи может обернуться чистым проигрышем. Практическая рекомендация известна: либо оставаться заметно ниже порога, либо переходить сразу к существенно большему размеру, чтобы прирост перекрыл потери. Заодно полезно помнить об устройстве объекта — заголовок с mark word и указателем на класс плюс выравнивание, из-за которого даже пустой объект занимает не ноль байт.
Что хотят услышать
- Механизм сжатых ссылок.
- Порог и последствия.
Частые ошибки
- Наращивать кучу до значения чуть выше порога.
- Считать, что память процесса линейно следует за -Xmx.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Сборщик мусора переключается на менее эффективный алгоритм
- ✗Metaspace начинает выделяться из кучи
- ✓Отключаются compressed oops, и ссылки вырастают вдвое
- ✗Операционная система не даёт одному процессу больше 32 ГБ
Что спросят дальше
- Из чего состоит заголовок объекта?
- Как проверить, включены ли compressed oops?
Разбор темы
- Память JVM и устройство объекта
Runtime data areas, стек против кучи, заголовок объекта и выравнивание, compressed oops и metaspace.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.