Пилообразная схема в использовании кучи может быть объяснена тем фактом, что несколько локальных переменных создаются во время вызова System.out.println
. В частности, в Oracle / Sun JRE несколько экземпляров HeapCharBuffer
создаются в молодом поколении, как отмечается в следующем снимке, полученном с использованием профилировщика памяти VisualVM:
Интересным является количество живых объектов, присутствующих в куче. Пилообразная структура является результатом цикла сбора мусора молодого поколения, который происходит, когда пространство eden заполняется; поскольку в программе не выполняются тяжелые вычислительные операции, JVM может выполнять несколько итераций цикла, в результате чего пространство eden (размером 4 МБ) заполняется. Последующий цикл сбора молодого поколения очищает большую часть мусора; это почти всегда все пространство eden, если только объекты не используются до сих пор, на что указывает следующая трассировка gc, полученная из VisualVM:
Поведение пилообразного паттерна, таким образом, можно объяснить последовательностью последовательных распределений объектов, которые заполняют пространство eden, запуская цикл сбора мусора молодого поколения; этот процесс повторяется циклически без каких-либо задержек, поскольку основной процесс JVM не прерывается другим процессом, а основной поток в JVM, отвечающий за распределение объектов, также не прерывается другим потоком.