我可以通过编程方式找出实例生成的GC生成吗?

时间:2010-12-16 00:36:56

标签: java garbage-collection jvm jvm-hotspot jvmti

此问题的范围仅限于HotSpot generations。有没有办法以编程方式找出特定实例所在的生成。数据如:

  • 年轻一代?
  • 如果年轻,哪个幸存者空间?
  • 里面的TLAB?哪个帖子?

任何技术(例如,BTraceJVMTI)只要我能做到这样的事情就会起作用:

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

乞丐不能选择,但理想情况下我也可以了解当感兴趣的实例在发生时从一代移动到另一代时(即基于事件回调 - 不感兴趣在轮询中隐含的延迟和开销中。)

对没有正当理由而只说“不”的答案不感兴趣:)

2 个答案:

答案 0 :(得分:4)

据我所知,您无法直接查询对象当前所在的内存池。但是,通过垃圾回收运行将对象提升到不同的内存池,您可以查询主要/次要gc的数量从VM开始使用JMX开始运行。如果在创建对象时另外记下这些计数器,则可以重建是否存在GC以及该对象所在的池。

答案 1 :(得分:3)

“计算自创建对象以来的GC数量”方法还有一个额外的复杂因素 - 它没有考虑过早提升对象

如果幸存者空间基本上太小,并且来自伊甸园的记忆压力(即物体存活至少一次的速度)很高,那么物体将在达到完全的终身临界阈值之前被提升为终身。

在实际示例中,健康应用程序通常具有非零百分比的过早促销。事实上,0%的过早提升率是一个非常糟糕的迹象 - 它表示你的幸存者空间太大,太大而且你浪费了很多记忆。