8

这个问题的范围仅限于HotSpot 世代。有没有办法以编程方式找出特定实例存在于哪一代。数据如:

  • 年轻一代还是老一代?
  • 如果年轻,哪个幸存者空间?
  • 在 TLAB 内部?哪个线程?

只要我能做这样的事情,任何技术(例如,BTraceJVMTI )都可以工作:

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

乞丐不能成为选择者,但理想情况下,我还可以了解感兴趣的实例何时从一代转移到另一代即,基于事件回调——对轮询中隐含的延迟和开销不感兴趣。)

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

4

2 回答 2

4

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

于 2010-12-16T02:30:23.963 回答
3

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

如果幸存者空间基本上太小,并且来自 Eden 的内存压力(即对象至少存活一次的比率)很高,那么对象将在达到完整的tenuring 阈值之前被提升为tenured。

在实际示例中,健康的应用程序通常会有非零百分比的过早提升。事实上,0% 的过早提升率是一个非常糟糕的信号——它表明你的幸存者空间太大了,而且你浪费了很多内存。

于 2012-02-01T15:23:48.927 回答