Java GC

JVM хранит память в двух местах

1) PermGem - метаданные об объектах и классах. А также пул строк вроде как ?

Размер PG можно задать двумя параметрами JVM: -XX:PermSize – задаёт минимальный, или изначальный, размер PG, и -XX:MaxPermSize – задаёт максимальный размер


2) Heap – основной сегмент памяти, где хранятся все ваши объекты. Heap делится на два подсегмента, Old Generation и New Generation

2.1) New generation делится в свою очередь еще на 3 сегмента
2.1.1) Eden
Новые объекты создаются в Eden
2.1.2) Survivor1
2.1.3) Survivor2
2.2) Old generation

Существует несколько алгоритмов, по которым может работать GC
1) Copy
Копирует все помеченные объекты из Eden в Survivor1 и т.п. При этом все потоки останавливаются, пока GC не закончит свою работу. Понятно, что он нигде не используется или возможно в каких-то исключительных ситуациях

2) Mark-Sweep-Compact Collection.
Я так понимаю, современный алгоритм, который используется во всех JVM
У алгоритма три этапа:
«Mark»: помечаются неиспользуемые объекты
«Sweep»: эти объекты удаляются из памяти.
«Compact»: объекты размещаются, занимая свободные слоты, что освобождает пространство на тот случай, если потребуется создать «большой» объект. Т.е как бы убираются дырки

Утилиты

jvisualvm утилита из коробки JDK, чтобы смотреть, как работает сборщик мусора

Настрофки
-Xms определяем исходный/минимальный размер heap в 512 мб
-Xmx определяем максимальный размер heap в 512 мб
-XX:NewRatio соотношение old generation к new generation
-XX:+PrintGCTimeStamps, -XX:+PrintGCDetails и -Xloggc:gc.log JVM печатает дополнительную информацию касаемо garbage collection в файл gc.log
-XX:PermSize – минимальный размер PG
-XX:MaxPermSize – максимальный размер PG

Комментариев нет:

Отправить комментарий