Долгое време модель памяти в Java оставалась для меня чем-то непостижимым. Я смотрел видео и читал статьи, но все это не принесло понимания. Но как-то раз, открыв VisualVM, картинка сложилась.
Тогда я и узнал, что...
1. Eden
содержит только что созданные объекты;2. Garbage Collector (GC)
периодически проверяет объекты, и, если объект все еще используется, то перемещает его в активную область Survivor;
3. Survivor
делится на S0 и S1
, которые чередуются в хранении выживших объектов при каждой проверке. Пока одна из областей содержит использующиеся объекты, вторая всегда остаётся пустой;4.
Объекты обладают счетчиком, который фиксирует, сколько раз GC
проверил объект*;5.
Когда счетчик достигнет порогового значения, GC
переместит объект в Old
, а не в Survivor
.*
Max Tenuring Threshold (MTT)
— кол-во проверок GC
-ом, которое должен пережить объект, чтобы оказаться в Old
.Histogram
(скрин 1) наглядно демонстрирует кол-во объектов, переживших n проверок GC;Чтобы лучше визуализировать работу GC, давайте рассмотрим скрин 2 и 3
1*
Запуск GC2*
Eden пустой после сборки мусора 3*
S0 также опустел, а S1 стал активным и принял все выжившие объекты из Eden и S0, за исключением 4*4*
Old пополнился новыми объектами, которые пережили MTT сборок мусораPS: Такая работа с
S0/S1
приводит к тому что:PS1:
Memory Size
зависит от архитектуры приложения и выполняющихся процессов. Алгоритм работы GC основывается на теории Слабой гипотезы о поколениях (или "Высокой детской смертности"), которая подразумевает, что объекты намного чаще умирают/перестают использоваться сразу после их создания.
Тем не менее, ваше приложение может, например, создать все необходимые объекты при старте и продолжать использовать их на протяжении всего времени. В таком случае запуски GC будут только потреблять ресурсы.
#jmm #heap #gc
@polyackov_ot
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🤯2