Ответ
JVM управляет памятью через несколько областей:
-
Heap — хранит объекты, делится на:
- Young Generation (Eden, Survivor 1/2) — для новых объектов, сборщик мусора (GC) работает часто.
- Old Generation — долгоживущие объекты, GC реже.
-
Stack — хранит примитивы и ссылки на объекты для каждого потока.
-
Method Area — метаданные классов, статические переменные.
-
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 помогают управлять памятью тоньше.