java - G1 GC什么时候会直接分配老年代的对象

标签 java garbage-collection jvm g1gc

在我的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 declarationhere is a usage of it ,在一个名为 G1CollectedHeap::new_gc_alloc_region 的方法中 - 在我看来,这是一个非常合适的名称。

关于java - G1 GC什么时候会直接分配老年代的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59997454/

相关文章:

java - 如何捕获错误

java - JAXB 更新字符串列表

c# - 内存不足异常,即使似乎有足够的内存可用

java - substring() 的垃圾友好替代品

java - 强制 JVM 尽早收集垃圾并减少尽早使用的系统内存

java - 可以从 JVM 调用 execve() 吗?

java - Java 分析中的线程与加载类

java - 如何用最大允许出现次数替换连续多次出现的字符?

java - 第二次尝试打开日历应用程序崩溃

java - 是否可以重用包含闭包的 Runnable