我可以通过编程方式找出一个实例的GC代表吗?
-
10-10-2019 - |
题
这个问题的范围有限 热点世代. 。是否有任何方法可以通过编程方式找出特定实例的生命。数据,例如:
- 年轻人还是老一代?
- 如果年轻,哪个幸存者空间?
- 内部tlab?哪个线程?
任何技术(例如 Btrace, JVMTI)只要我能做这样的事情,就可以工作:
Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
乞g不能成为选择者,但是理想情况下,我也可以学习何时感兴趣的实例从一代人转移到另一代 目前发生 (即基于事件回调 - 对投票中隐含的延迟和间接费用不感兴趣。)
对没有理由的答案不感兴趣的答案不感兴趣:)
解决方案
据我所知,您无法直接查询当前对象当前居住的对象的内存池。但是,通过运行垃圾收集的对象被促进到其他内存池,您可以查询主要/次要GC运行的数量,因为VM开始使用JMX。如果您还要在创建对象时还要注意这些计数器,则可以重建是否有GC以来是否有GC,并且从该物体中居住在该物体中。
其他提示
“计算对象创建的GC的数量”,还有一个额外的并发症 过早的对象促进.
如果幸存者的空间基本上太小了,并且伊甸园的记忆压力(即至少生存一次的物体速率)很高,则物体将在达到整个任期阈值之前将其提升为终身任期。
在真实的例子中,健康的应用通常将具有过早促销的非零百分比。实际上,0%的过早晋升率是一个非常糟糕的信号 - 它说您的幸存者空间太大了,您正在浪费很多记忆。
不隶属于 StackOverflow