Память

Проработать

  1. Модель памяти в примерах и не только
  2. Java-модель памяти (часть 1)
  3. Что такое Heap и Stack память в Java?
  4. Дюк, вынеси мусор! — Часть 1
  5. Garbage Collection наглядно
  6. Java 8: от PermGen к MetaSpace
  7. JAVA. Memory Model
  8. Что Каждый Программист Должен Знать О Памяти. (с)
  9. Задача из Собеседования в Microsoft (Бинарные Деревья)
  10. How Java Memory Works?
  11. Глубокое погружение в Java Memory Model
  12. happens before java - модель памяти
  13. Разобраться как смотреть логи GC - https://www.baeldung.com/java-verbose-gc

Основные разделы

Типы памяти

Вся область памяти называется Native Memory

PermGen (Permanent Generation)

Описание

  1. С Java 8 ему на смену пришла область Metaspace.

Metaspace (метаданные)

Описание

  1. Является общими для всех.
  2. Макс размер настраивается с помощью флага MaxMetaspaceSize.

Здесь хранятся

  1. Хранятся метаданные классов.
  2. Статические переменные.

CodeCache (кэш кода)

Описание

  1. JIT-компилятор компилирует часто исполняемый код, преобразует его в нативный машинный код и кеширует для более быстрого выполнения.

Heap(куча)

Описание

  1. Используется Java Runtime для выделения памяти и хранения объектов и JRE классов.
  2. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок.
  3. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения.
  4. Доступно для всех потоков.
  5. Для JVM мы можем задать начальный пул выделения памяти (Xms) и максимальный пул выделения памяти (Xmx).
  6. Если куча переполнена получаем OutOfMemoryError.

Здесь хранятся

  1. При запуске программы сюда загружаются все классы среды выполнения
  2. Pool String
  3. Объекты
  4. Переменные(поля) объекта
  5. Статические переменные

Stack

Описание

  1. Всякий раз, когда вызывается метод, в памяти стека создается новый блок, и после его завершения удаляется вместе с переменными(LIFO).
  2. Размер стековой памяти намного меньше объема памяти в куче.
  3. Используется только одним потоком.
  4. Для JVM мы можем задать максимальный пул стековой памяти(Xss).
  5. Если память стека переполнена получаем StackOverflowError.

Здесь хранятся

  1. Stack вызова методов.
  2. Локальные(внутри методов) примитивы.
  3. Ссылки на локальные объекты(которые хранятся в heap).

Garbage Collector

Мусор - объект в Heap на которого никто не ссылается.

Работа Garbage Collector

  1. Mark(маркировка) - на первом этапе GC сканирует все объекты и помечает живые. Выполнение программы приостанавливается. Поэтому этот шаг также называется "Stop the World".
  2. Sweep(очистка) - очистка объектов без отметок.
  3. Compact(уплотнение) - оставшиеся объекты подвигаются друг к другу для удобства.

Поколения объектов

Для оптимизации сборки мусора память кучи дополнительно разделена на четыре области. В эти области, объекты помещаются в зависимости от их возраста(как долго они используются в приложении).

    Young Generation

  1. EDEN - новые объекты.
  2. S0, S1(Survivor space) - выжившие.
  3. Old generation

  4. OLD - для старых объектов.

Алгоритм сборки мусора, использующий поколения

  1. Новые объекты создаются в EDEN.
  2. Когда область Eden заполняется, происходит минорная сборка мусора (Minor GC). Minor GC — mark и sweep выполняются для young generation.
  3. Живые объекты перемещаются в одну из областей Survivor (например, S0).
  4. При следующем Minor GC процесс повторяется. Но объекты в областях S0 и S1 меняются метами, увеличивая свой возраст.
  5. Объекты между областями Survivor копируются определенное количество раз (пока не переживут определенное количество Minor GC) или пока там достаточно места. Затем эти объекты копируются в область Old.
  6. Major GC - этапы mark и sweep выполняются для Old Generation. Major GC работает медленнее по сравнению с Minor GC, поскольку старое поколение в основном состоит из живых объектов.

Сборка мусора: флаги

Включение логов GC

-XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -
Xloggc:/tmp/[Application-Name]-[Application-port]-%t-gc.log -
XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=20 -
XX:GCLogFileSize=100M
        

Виды Garbage Collector(сборщик мусора)

  1. Serial Garbage Collector - S GC

    Один поток.

    -XX:+UseSerialGC

  2. Parallel Garbage Collector - P GC

    Несколько потоков.

    Многопоточность ускоряет сборку мусора.

    -XX:+UseParallelGC

  3. CMS Garbage Collector - CMS GC
  4. G1 Garbage Collector - G1 GC

    Выполняет некоторую тяжелую работу параллельно с работой приложения.

    -XX:+UseG1GC

  5. The Z Garbage Collector - ZGC

    Выполняет всю тяжелую работу параллельно с работой приложения.

    В приоритете время отклика.

    Низкая задержка.

    -XX:+UseZGC

Garbage Collector по умолчанию

  1. Java 7 - Parallel GC
  2. Java 8 - Parallel GC
  3. Java 9 - G1 GC
  4. Java 10 - G1 GC
  5. Java 11 - Z GC

Вопросы

System.gc() - метод для выполнения сбора мусора. Но JVM сама решить запускать или нет.

finalize() - вызывается перед удалением объекта. С Java 9 не рекомендуем к использованию.