Как устроена память в JVM

«Как устроена память в JVM» — вопрос из категории Управление памятью, который задают на 27% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JVM управляет памятью через несколько областей:

  1. Heap — хранит объекты, делится на:

    • Young Generation (Eden, Survivor 1/2) — для новых объектов, сборщик мусора (GC) работает часто.
    • Old Generation — долгоживущие объекты, GC реже.
  2. Stack — хранит примитивы и ссылки на объекты для каждого потока.

  3. Method Area — метаданные классов, статические переменные.

  4. PC Register & Native Method Stack — для нативных методов и текущих инструкций.

Пример утечки памяти:

// Static список хранит ссылки → объекты не удаляются GC
public class MemoryLeak {
    static List<Object> list = new ArrayList<>();
    void addData() {
        while (true) list.add(new Object());
    }
}

Нюансы:

  • OutOfMemoryError возникает при переполнении Heap/PermGen (метаданных).
  • Weak/Soft/PhantomReference помогают управлять памятью тоньше.