java - 我可以通过编程方式找出实例所在的 GC 代吗?

标签 java garbage-collection jvm jvm-hotspot jvmti

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

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

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

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

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

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

最佳答案

据我所知,不能直接查询一个对象当前在哪个内存池中自 VM 开始使用 JMX 以来运行。如果您在创建对象时另外注意这些计数器,则可以重建自对象所在的池以来和从中是否有 GC。

关于java - 我可以通过编程方式找出实例所在的 GC 代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4456415/

相关文章:

scala - 如何开始使用 scala

Java长时间运行程序递归导致的StackOverflowError

java - 构建路径问题

java - 这些 Ant/JVM args 有什么问题?

java - eclipse 内存分析器看到整个堆转储 (8GB) 的一小部分 (363,2MB)

java - 由于持续的 GC,强制 JVM 崩溃

java - 如何找到哪个Finalizer耗时

java - 语音转文本,java语音API,哪里可以找到?

c# - 为什么 GC 在我引用它时收集我的对象?

java - 检查文件是否存在且没有太多垃圾