Сборщик мусора Serial GC в Java

Java управляет памятью автоматически и в большинстве случаев нам не приходится вмешиваться в этот процесс, но понимать, что там происходит всё же полезно, особенно если хотите блеснуть этими знаниями на собеседованиях, для которых также полезно почитать мой «Учебник Java 8». В некоторых (но довольно редких случаях) вам может пригодиться умение оптимизировать работу сборщика мусора с помощью выставления различных флагов виртуальной машины Java, но это уж очень редкая ситуация.

В этой статье речь пойдёт о самом простом сборщике мусора в Java — serial garbage collector (последовательный сборщик мусора или serial GC). Последовательным он называется, потому что при его работе выполнение программы приостанавливается. Происходит так называемый Stop The World.

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

Однако последовательный сборщик мусора, описываемый в этой статье, использует поколения объектов, для уменьшения количества обходимых за один раз объектов. Идея состоит в том, что большая часть объектов существует очень короткое время (различные итераторы, временные объекты для передачи параметров и др.), и лишь небольшая кучка объектов существует достаточно долго.

В соответствии с описанным выше алгоритм сборки serial garbage collector использует два поколения: молодое и старое. Молодое поколение делится на: Eden, Survivor1 и Survivor2, как на картинке:

Разделение памяти для последовательного сборщика мусора serial garbage collector

Если дословно переводить с английского, то Eden — это Эдем, райский сад из Библии, место первоначального обитания людей; survivor — уцелевший, спасшийся; tenured — штатный.

При инициализации большая часть адресного пространства резервируется виртуально, но не выделяется физически (на изображении это области Virtual).

Новые объекты почти всегда создаются в Eden, исключение могут составлять большие объекты, которые накладно постоянно перемещать между областями survivor. Большая часть объектов там же и уничтожается. Одна из областей survivor всегда пуста. При первой сборке мусора в молодом поколении выжившие объекты перемещаются в один из регионов survivor. При второй сборке мусора в молодом поколении смотрятся объекты в Eden и в заполненном survivor, а все выжившие объекты переносятся в свободный survivor и т. д.

Объекты переносятся между областями survivor до тех пор, пока они не будут достаточно стары, чтобы их можно было переместить в tenured. Когда область tenured заполнится, то включается полная сборка мусора, которая затрагивает объекты из обоих поколений, и которая длится дольше, чем сборка только в молодом поколении.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *