这个问题的范围有限 热点世代. 。是否有任何方法可以通过编程方式找出特定实例的生命。数据,例如:

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

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

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

乞g不能成为选择者,但是理想情况下,我也可以学习何时感兴趣的实例从一代人转移到另一代 目前发生 (即基于事件回调 - 对投票中隐含的延迟和间接费用不感兴趣。)

对没有理由的答案不感兴趣的答案不感兴趣:)

有帮助吗?

解决方案

据我所知,您无法直接查询当前对象当前居住的对象的内存池。但是,通过运行垃圾收集的对象被促进到其他内存池,您可以查询主要/次要GC运行的数量,因为VM开始使用JMX。如果您还要在创建对象时还要注意这些计数器,则可以重建是否有GC以来是否有GC,并且从该物体中居住在该物体中。

其他提示

“计算对象创建的GC的数量”,还有一个额外的并发症 过早的对象促进.

如果幸存者的空间基本上太小了,并且伊甸园的记忆压力(即至少生存一次的物体速率)很高,则物体将在达到整个任期阈值之前将其提升为终身任期。

在真实的例子中,健康的应用通常将具有过早促销的非零百分比。实际上,0%的过早晋升率是一个非常糟糕的信号 - 它说您的幸存者空间太大了,您正在浪费很多记忆。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top