我们都知道 堆内存被分为年轻代 和 年老代 ,默认比例是1:2. 年轻代占1/3.
年轻代 gc使用的算法是 copy算法(速度快,但是会浪费一个survivor内存),年老代使用的是 标记整理算法(速度慢)。基于此,来了解一下年轻代和年老代分配过大 或 过小会有哪些影响。
年轻代过大:
1:会导致生命周期长的对象 长时间在年轻代,在s0和s1之间来回复制,增加复制开销。
2:年轻代过大,那么年老大就会很小,就会频繁出发fullGC. 由于年老代使用的是标记整理算法,本来就会很慢,就导致stw的时间长。而频繁的fullGC 更是会 降低用户体验,常常出现卡顿现象。
年轻代过小:
1:会频繁触发minorGC, 导致一些不常用对象也很快达到进入年老代的年龄(默认15)。这样一来,年老代也会很容易被填满。fullGC的时间会更长
额外话:
大对象直接进入老年代
Minor GC的规则
大对象直接进入老年代
-XX:PretenureSizeThreshold
指定大于该数值的对象直接进入老年代,避免在新生代的Eden和两个Survivor区域来回复制,产生大量内存复制操作。
缺点:只对Serial和ParNew两个新生代收集器有用