【问题标题】:How can I analyze what objects are in which generation?如何分析哪些对象属于哪一代?
【发布时间】:2012-08-15 14:18:31
【问题描述】:

我有一个长时间运行(多天)的应用程序,其中包含我希望在它们被垃圾收集之前保留不同时间长度的对象。假设有四个类别:

  1. 非常短暂(
  2. 在用户关注的持续时间内存活(1s
  3. 每日数据(~24 小时)
  4. 'Eternal'(很少,应用程序的生命周期)

为了帮助进行调优,我想找到一种方法,使用 Java 6 Hotspot VM 检查哪些实际数据进入了终身代。使用 jmap 生成 HPROF 文件似乎不包含世代信息。有没有其他方法可以获取这些信息?

【问题讨论】:

    标签: java garbage-collection jvm-hotspot jmap


    【解决方案1】:

    不,没有简单的方法可以获取单个对象的生成信息。事实上,如果你要求“活”对象,这将触发 Full GC 并将所有对象放入老年代(所以现在你知道所有对象在哪里,但不知道它们在哪里)

    在完整 GC 中幸存下来的对象很可能在老年代,因此如果您的系统每 5 分钟执行一次完整 GC,那么任何持续时间更长的对象都差不多。

    您可以做的最好的事情是尽量减少丢弃的对象(使用内存分析器来帮助)这将提高 GC 性能并减少它们发生的频率。在极端示例中,您可以使用堆外内存,这很难使用,但几乎不使用堆。如果您有许多 GB 的数据,尤其有用。

    【讨论】:

    • 鉴于带有 Visual GC 插件的 VisualVM 确实显示了各个代中事物的大小,我认为可能还有另一种方式来挂钩。没有这样的运气?
    • 我不知道。我怀疑扰乱系统的开销使得它很难有意义。
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2014-07-09
    • 2012-11-18
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多