在我的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 位服务器虚拟机(版本 25.222-b10,混合模式)
************更新于2020/01/31****************
这不是巨大的对象,gc日志将以另一种方式显示巨大的对象分配,请参阅以下gc日志摘录,谢谢!
>> 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
最佳答案
当分配大对象(来自单个区域的 50% 或更多)时,就会发生这种情况。甚至是source code has a comment saying that .
请记住,数组也是对象,因此当您分配一个大的基元数组时,您可能会属于此类。话虽这么说,您有一个非常新的 JVM 版本,其中这些非常大的对象可以作为年轻集合的一部分进行回收。
编辑
ALLOC(OLD)
并不意味着您的应用程序已开始在老一代中分配对象。它只是意味着这个特定区域在这个 GC 周期中开始被使用。 here is the method declaration和 here is a usage of it ,在一个名为 G1CollectedHeap::new_gc_alloc_region
的方法中 - 在我看来,这是一个非常合适的名称。
关于java - G1 GC什么时候会直接分配老年代的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59997454/