Могу ли я программно узнать, в каком поколении GC живет экземпляр? - PullRequest
8 голосов
/ 16 декабря 2010

Этот вопрос ограничен поколениями HotSpot . Есть ли способ программно узнать, в каком поколении живет тот или иной экземпляр. Данные, такие как:

  • Молодое или старое поколение?
  • Если молодой, какой выживший космос?
  • Внутри TLAB? Какая нить?

Любая техника (например, BTrace , JVMTI ) работает до тех пор, пока я могу сделать что-то вроде этого:

Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);

Нищие не могут быть селекторами, но в идеале я мог бы также узнать, когда интересующий объект перемещался из одного поколения в другое в момент, когда это происходит (т. Е. На основе обратного вызова события - не заинтересован задержка и накладные расходы, подразумеваемые при опросе.)

Не заинтересованы в ответах, которые просто говорят "нет" без обоснования :)

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Насколько я знаю, вы не можете напрямую запрашивать, в каком пуле памяти находится объект, в настоящее время живущий. Однако объекты переносятся в другой пул памяти при выполнении сборки мусора, и вы можете запросить количество основных / вспомогательных ресурсовработает, так как VM начинает использовать JMX.Если вы дополнительно примете к сведению эти счетчики при создании объекта, вы сможете восстановить, существовал ли ГХ с тех пор, и из того, в каком пуле находится объект.

3 голосов
/ 01 февраля 2012

Существует дополнительная сложность в подходе «подсчитать количество ГХ с момента создания объекта» - он не учитывает преждевременное продвижение объекта .

Если места для выживших в основном слишком малы, а нагрузка на память в Эдеме (то есть скорость выживания объектов хотя бы один раз) высока, то объекты будут переведены в режим владения до того, как они достигнут полного порога владения.

В реальных примерах здоровые приложения обычно имеют ненулевой процент преждевременного продвижения. На самом деле, показатель преждевременного продвижения на 0% - это действительно плохой признак - он говорит о том, что ваши места для выживших слишком велики, и вы тратите много памяти.

...