2010-07-09 2 views
1

Можно ли предположить, что скорость, с которой новые объекты создаются программой Java, несколько превышает скорость, с которой эти объекты вывозятся мусором в молодое поколение?Скорость сбора мусора и ставка распределения объектов

... Таким образом, возникает все большее отставание от новых объектов, сидящих на куче, до тех пор, пока не будет запущен полный gc?

Любые показатели, которые я мог бы собрать, чтобы идентифицировать/проверить этот сценарий?

Созданные объекты имеют максимальный срок службы около 1 секунды. Большинство из них живут в среднем около 400 миллисекунд.

Спасибо.

ответ

3

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

S0 и S1 - пространство для хранения между Молодым (Eden) и Старинным пространством.

GC работает так долго, что есть объекты для копирования, отбрасывая всех мертвых. Полный GC выполняется, когда память действительно нуждается в восстановлении, например, объекты должны быть удалены из Старого пространства.

Самый быстрый способ очистить пространство Яблока - это на самом деле ждать до тех пор, пока большинство объектов не будет мертвым, поэтому вам не придется копировать столько, сколько нужно для S0 | S1, а затем и для старого.

Таким образом, заполнение памяти, а затем снятие штрафа за более длительный прогон GC на самом деле более эффективно, а затем запуск GC с очень короткими интервалами. Вот почему вы видите, что ваша память растет и растет до тех пор, пока она не будет полностью заполнена, а затем все это снова упадет почти до нуля.

Полный GC - это StopTheWorld, это необходимо для переупорядочения объектов в куче в старом пространстве, оно не требуется в пространстве Юнга. Если молодое пространство становится полным для быстрых объектов, их можно продвигать до Старого пространства. Это не очень хорошо, и это тот случай, о котором вы думаете.

Чтобы избежать использования Full GC, вы можете рассчитать, сколько памяти вам понадобится в Young Space с темпом создания, который вы должны убедиться, что объекты не будут продвигаться до этого.Также возможно настроить размер пространства S0 и S1 и сколько раз объекты будут отскакивать между ними до того, как они окажутся в Старом пространстве (требуется, чтобы Full GC был удален).

Хорошая ссылка, но немного старая на этом Tuning Garbage Collection

1

Вполне возможно ...

Я не думаю, что HotSpot последовательный, параллельный или CMS коллекторы будут вести себя таким образом. Вы можете прочитать о них все here, here и here (для коллекционера G1).

Существует одна ситуация, когда объекты получают повышение без цикла GC молодого поколения. То есть, когда коллекционер определяет, что старое пространство слишком полно, чтобы удерживать все более продвигаемые объекты. Затем последовательный или параллельный коллектор будет выполнять полную коллекцию молодых и старых поколений.

Любые показатели, которые я мог бы собрать, чтобы идентифицировать/проверить этот сценарий?

Журналы GC могут выявить это. Я не знаю.

Смежные вопросы