2010-12-16 3 views
8

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

  • Молодые или старые поколения?
  • Если молодой, кто выжил?
  • Внутри TLAB? Какой поток? (. Ех, BTrace, JVMTI)

Любой метод работает так долго, как я могу сделать что-то вроде этого:

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

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

не интересуют ответы что просто сказать «нет» без обоснования :)

+1

Мне любопытно, почему вас это интересует. Помимо чистого любопытства, конечно :) – drekka 2010-12-16 02:42:18

ответ

4

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

3

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

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

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