【问题标题】:When will G1 GC allocate objects in old generation directlyG1 GC什么时候会直接在老年代分配对象
【发布时间】:2020-05-16 17:50:23
【问题描述】:

在我的gc日志中,有很多对象分配给老年代(ALLOC(Old)日志),当前阈值为15,我的对象年龄只有1,即这些对象不会被提升到老年代,我猜猜在 G1 GC 中直接将对象分配给老年代有什么条件吗?提前致谢!

GC 日志摘录:

grep "ALLOC(Old)" gc.log | wc -l

387

grep "thres" gc.log

Desired survivor size 1207959552 bytes, new threshold 15 (max 15)

Desired survivor size 1207959552 bytes, new threshold 15 (max 15)

- age   1:   37707272 bytes,   37707272 total

JDK版本:

  • openjdk 版本“1.8.0_222”

  • OpenJDK 运行时环境(内部版本 1.8.0_222-b10)

  • OpenJDK 64 位服务器 VM(内部版本 25.222-b10,混合模式)

*********2020/01/31更新****************

这不是巨大的对象,gc log 会以另一种方式显示巨大的对象分配,请参考下面的 gc log 摘录,谢谢!

>> grep "StartsH" gc.log | wc -l

51

>> grep "ContinuesH" gc.log | wc -l

324

>> grep "ALLOC(Old)" gc.log | wc -l

528

参考:https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2

【问题讨论】:

    标签: java garbage-collection jvm g1gc


    【解决方案1】:

    当分配了一个大对象(来自单个区域的 50% 或更多)时,就会发生这种情况。甚至source code has a comment saying that

    请记住,数组也是对象,因此当您分配大量原始数组时,您可能属于这一类。话虽如此,您有一个最新的 JVM 版本,其中这些非常大的对象可以作为年轻集合的一部分进行回收。

    编辑

    ALLOC(OLD) 并不意味着你的应用程序已经开始在老年代分配对象。它只是意味着这个特定区域,在这个 GC 周期中开始被使用here is the method declarationhere is a usage of it,在称为 G1CollectedHeap::new_gc_alloc_region 的方法中 - 一个非常合适的名称 IMO。

    【讨论】:

    • 感谢您的 cmets!其实它不是巨大的对象,gc log 会以另一种方式显示巨大的对象分配,请参考下面的 gc log 摘录,谢谢! # grep "StartsH" gc.log | wc -l 51 # grep "ContinuesH" gc.log | wc -l 324 # grep "ALLOC(Old)" gc.log | wc -l 528 参考:redhat.com/en/blog/…
    猜你喜欢
    • 2021-07-01
    • 2014-08-28
    • 2020-05-16
    • 1970-01-01
    • 2011-11-20
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多