Память JVM (heap, stack)
Тема дорожной карты · Java
Модель памяти JVM определяет, как Java Virtual Machine выделяет, организует и освобождает память во время выполнения Java-приложения, напрямую влияя на поведение GC, задержку и пропускную способность. Куча разделена на поколения — Young (Eden + области Survivor) и Old/Tenured, — где объекты продвигаются по мере того, как переживают последовательные циклы GC, выполняемые сборщиками G1GC, ZGC или Shenandoah. Каждый поток поддерживает собственный стек JVM, содержащий фреймы стека для локальных переменных и стеков операндов, тогда как метаданные классов находятся в Metaspace (заменившем PermGen начиная с JDK 8), а JIT-скомпилированный код — в CodeCache. Разработчики анализируют поведение памяти JVM с помощью инструментов командной строки jmap, jstat и jcmd или профилировщиков на основе flight recorder, таких как JDK Mission Control, для обнаружения утечек памяти, чрезмерного давления GC и условий OutOfMemoryError. Правильное понимание модели памяти JVM критично при настройке размеров кучи (-Xms, -Xmx), алгоритмов GC и глубины стека потоков для высокопроизводительных приложений Spring и Hibernate, развёрнутых в контейнеризованных JDK-окружениях.
Как это работает
Память JVM (heap, stack) покрывает class loading (Bootstrap, Platform, Application classloaders), байткод (JIT-компилируется HotSpot C1/C2 или AOT через GraalVM), GC (G1 — дефолт 9+; ZGC + Shenandoah — low-pause; Parallel — throughput), memory areas (heap, metaspace, stack, native), JFR (Java Flight Recorder) — production-профайлинг, jstack/jmap/jstat — CLI-тулзы.
Когда применять
Тюньте heap (-Xms = -Xmx для предсказуемой аллокации; размер = ~60-80% доступной RAM в контейнере). G1 GC — кроме нужды в очень низких паузах (тогда ZGC или Shenandoah). Гоняйте JFR непрерывно в production с низким overhead — бесценно, когда что-то идёт не так. jcmd — для взаимодействия с живой JVM. Читайте GC-логи (-Xlog:gc*:file=gc.log).
Типичные ошибки
Ловушки Память JVM (heap, stack): дефолтный -Xmx 256MB или 25% RAM хоста (часто мал — задавайте явно); выбор CMS GC (deprecated, удалён); игнор native-памяти (off-heap buffers, JNI) когда total memory > heap; запуск профайлера без warmup (JIT-warmup искажает цифры).
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…