Могу ли я программно выяснить, в каком генерации GC живет экземпляр?

StackOverflow https://stackoverflow.com/questions/4456415

Вопрос

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

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

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

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

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

Не интересует ответы, которые просто говорят «нет» без оправдания :)

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top