当前位置: 首页 > 知识库问答 >
问题:

满GC后,年轻一代的收集减少10倍

郎诚
2023-03-14

这里有我的GC.log的摘录:

2013-02-28T12:02:13.209+0100:1486457.849:[GC 1486457.850:[ParNew 3483368K->96838K(3774912K),0.2273030秒]8085678K->4710336K(49912256K),0.2278070秒][times:user=1.54 sys=0.01,real=0.23秒]

2013-02-28T12:02:26.551+0100:1486471.191:[GC 1486471.191:[ParNew 3452358K->125528K(3774912K),0.2386800秒]8065856K->4748772K(49912256K),0.2392150秒][times:user=1.64 sys=0.01,real=0.24秒]

2013-02-28T12:02:27.398+0100:1486472.038:[完整GC 1486472.039:[CMS:4623244K->3323834K(46137344K),3.0873920秒]5034629K->3323834K(49912256K),[CMS Perm:97619K->54323K(98304K)],3.0878880秒][时间:用户=3.04 SYS=0.01,REAL=3.08秒]

2013-02-28T12:02:42.758+0100:1486487.398:[GC 1486487.399:[ParNew 3355519K->50321K(3774912K),0.0289980秒]6679353K->3374156K(49912256K),0.0295550秒][times:user=0.20 SYS=0.00,real=0.03秒]

2013-02-28T12:02:59.045+0100:1486503.685:[GC 1486503.685:[ParNew 3405841K->71853K(3774912K),0.0316570秒]6729676K->3395688K(49912256K),0.0321860秒][times:user=0.22 sys=0.00,real=0.03秒]

在一个完整的GC之后(由于烫发空间耗尽),年轻一代的收集从0.23秒减少到0.03秒(10次)。

我必须找出烫发空间变满的原因,但我不明白的是为什么年轻一代收集时间因为满了GC而减少10倍。

有人能帮我吗?

谢谢,琼。

共有1个答案

萧晔
2023-03-14

根据上面提到的日志,我可以说出几点。

原因可以是:

当程序运行时,分配发生,引用发生。短命物体死亡和Rest提升到幸存者空间或烫发空间。

2)有时perm空间和tenured空间中的对象引用年轻一代的对象(伊甸园空间和survivor空间中的对象)。

因为在tenured和perm空间中的垃圾收集不像年轻一代那么频繁。

可能存在这样的情况:perm空间或tenured空间中的对象(例如obj1)不再被引用,并准备好被GC声明,因此该obj1正在等待GC,这种情况很少发生。同样,该obj1可能引用了survivor和eden空间中的对象。因此obj1引用的eden空间和survivor空间中的这些对象不符合垃圾回收的条件。因此,在eden空间和survivor空间中可能有很多这样的对象,这些对象被来自perm空间的对象obj1引用,这导致eden空间和survivor空间中有更多的对象。

在完整的GC中,像obj1这样的对象会被收集,因此像obj1这样的对象引用的eden和survivor中的任何对象也不会被GC声称,这导致eden和survivor空间中的对象数量更少。由于对象的数量较少,所以小型GC花费的时间较少。如果你观察到更多的日志,慢慢地小Gc时间再次增加(日志中提到的0.0289980秒,0.0316570),它可能会增加到下一个完整的Gc。

你也可以观察到GC时间的模式,在满GC之前,它正在增加。(0.2273030秒,0.2386800秒,如你的日志中提到的)

 类似资料:
  • 框架:Spring+mybatis+dubbo+RocketMQ。 下面是JVM参数: -server-xmx5g-xms5g-xn1g-xx:metaspacesize=512m-xx:maxmetaspacesize=512m-xss256k-xx:survivorratio=8-xx:+printgcdetails-xloggc:/opt/apps/logs/gc.log-xx:+print

  • 如果我错了,请随时指正。在JVM堆中,有老一代和年轻一代两代。在做全GC时,在老一代中,有像紧凑空间和修复漏洞这样的繁重操作,这会使JVM挂起。而我发现在年轻一代中,应用了一个轻量级的GC,从我的搜索结果中还有一个叫做Eden的区域涉及年轻一代。但是,在搜索了很多文档后,我对年轻一代中的GC仍然有两个困惑, 在年轻一代中,GC似乎不像老一代GC那样工作(即老一代GC压缩并修复漏洞)?如果是这样,年

  • 问题内容: 当伊甸园空间年轻时已满,将触发次要GC。在次要GC过程中,伊甸园和一个源Survivor空间中的非自由对象将被复制到另一个目标Survivor空间。 我的问题是,如果目标“幸存者”空间已满,次要GC如何处理? 问题答案: 如果不可能执行/完成次要收集,则将执行主要/完整收集。通常使用标记扫描紧凑算法而不是复制算法来完成此操作……这是完整收集昂贵的原因之一。 但是最终(如果您继续填充堆)

  • 我在尝试理解垃圾收集机制,我在研究代际算法,我有一个关于年轻人和老年人的代沟的问题。我读到,在年轻一代开始收集物品,GC是从GC根开始标记它们,以找到活的,通常它会将它们复制到幸存者空间,清除年轻一代区域,然后瞧。 我不明白,如果我们从GC根开始,我们开始遍历活动对象,我们不是也在旧一代中找到了对象吗?这是否意味着,当我们击中旧空间中的一个物体时,我们会在那个点上停止跟踪参照物?

  • 当伊甸园空间充满年轻一代时,小GC将被触发。在次要GC过程中,伊甸园和一个源幸存者空间中的非自由对象将被复制到另一个目标幸存者空间。 我的问题是,如果目标幸存者空间已满,minor GC如何处理?

  • 那么,我们是否可以仅使用选项运行JVM?我的意思是没有任何为年轻一代描述垃圾收集器的选项。如果我们能那样做,哪一个垃圾收集器将用于老一代?