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

Bri*_*ris 8 java garbage-collection jvm jvm-hotspot jvmti

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

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

任何技术(例如,BTrace,JVMTI)都可以工作,只要我可以这样做:

Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
Run Code Online (Sandbox Code Playgroud)

乞丐不能挑肥拣瘦,但最好我也能学到当目标实例正在从一代转移到另一个在它发生的那一刻(即事件回调基础-在时延和轮询开销隐含不感兴趣)

对没有理由的只是说"不"的答案不感兴趣:)

mer*_*ike 4

据我所知,你不能直接查询对象当前所在的内存池。但是,通过垃圾收集运行,对象会被提升到不同的内存池,并且你可以查询自VM以来运行的major/minor gc的次数开始使用 JMX。如果您在创建对象时另外记录这些计数器,则可以重建该对象所在的池中是否存在 GC。