JVM系列---【为什么我的系统在大促期间,频繁fullgc?】
  Afe4H47zX3K6 2023年11月08日 59 0

为什么我的系统在大促期间,频繁fullgc?

前置知识

  • 一般来说,我们的老年代大小,一般设置为堆内存大小的2/3,年轻代一般设置为堆内存大小的1/3,而年轻代里面一般分为伊甸园区,S0区和S1区,这三个的比例一般按年轻代大小的8:1:1进行分配。
  • 正常来讲,对象先进入伊甸园区,然后进入S0(或S1)区,年龄加1,然后进入S1(或S0区)年龄再加1,在S区反复存活够15岁,便进入老年代,最终老年代如果满了,就会触发FullGc。
  • 但是有一些条件下,对象会直接从伊甸园区进入老年代,例如:
    大多数是这种情况,根据年龄进入老年代


    下面这种情况,要适当调整8:1:1的比例,尽量让朝生夕死的大对象在年轻代里,通过minorgc(或younggc)回收掉,来避免频繁fullgc。

    下面这种情况,这里暂时了解即可。

预估请求每秒产生的对象大小

JVM系列---【为什么我的系统在大促期间,频繁fullgc?】_对象流

对象流转过程分析

JVM系列---【为什么我的系统在大促期间,频繁fullgc?】_老年代_02

解决思路

我可以通过jstat命令,确定每次当前伊甸园区移到s0或s1区的对象的大小,然后有两种思路来解决这个问题:
1.调小老年代大小,同时调大年轻代大小,使每次流转到s0的对象大小达不到s0的50%,就能解决这个问题。
2.老年代大小不变,改变年轻代的8:1:1的比例,例如,这里我把比例改成6:1:1,也可以解决动态年龄判断这个问题。

愿你走出半生,归来仍是少年!



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
Afe4H47zX3K6