Могу ли я программно выяснить, в каком генерации GC живет экземпляр?
-
10-10-2019 - |
Вопрос
Этот вопрос ограничен по объему Поколения горячей точки. Анкет Есть ли способ программно выяснить, в каком поколении живет конкретный экземпляр. Данные, такие как:
- Молодое или старое поколение?
- Если молоды, какое пространство выживших?
- Внутри TLAB? Какая нить?
Любая техника (например,, Btrace, Jvmti) работает, пока я могу сделать что -то вроде этого:
Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
Нищие не могут быть выбранными, но в идеале я также мог узнать, когда был перемещен случай интереса из одного поколения в другое На данный момент это происходит (т.е., основанный на обратном вызове событий - не заинтересован в задержке и накладных расходах, подразумеваемых в опросах.)
Не интересует ответы, которые просто говорят «нет» без оправдания :)
Решение
Насколько я знаю, вы не можете напрямую запросить, в каком пуле памяти объект живет в настоящее время. Однако объекты продвигаются в другом пуле памяти с помощью запуска сбора мусора, и вы можете запросить количество основных/минорных GC с виртуальной машиной. Начните использовать JMX. Если вы дополнительно примите к сведению эти счетчики при создании объекта, вы можете реконструировать, был ли GC с тех пор, в каком пуле, в котором находится объект.
Другие советы
Существует дополнительное осложнение «подсчитать количество GCS с момента создания объекта» - он не учитывает преждевременное продвижение объекта.
Если места для выживших в основном слишком малы, а давление в памяти от Eden (то есть скорость выживающих объектов, по крайней мере, один раз), то объекты будут способствовать добыче до того, как они достигнут полного порога сдерживания.
В реальных примерах здоровые приложения, как правило, будут иметь ненулевой процент преждевременного продвижения. На самом деле, на 0% преждевременный показатель продвижения - это действительно плохой знак - он говорит, что ваши места для выживших намного, слишком велики, и вы тратите много памяти.