求助>关于G1收集器的几个问题>
1回复

关于G1收集器的几个问题



关于G1收集器,我一直有几个问题不明白,不知道有大佬能释疑下吗?
1
G1中的新生代和老年代是和CMS一样,固定的,不会动态调整的吗?
2
G1中新生代回收,老年代回收触发条件和CMS是一样的吗?新生代空间按固定比例分配好,然后满了就触发新生代回收,
老年代按使用比例,达到设定的比例就触发?
3
G1会根据设定的最大停顿大小,计算回收哪些区,这个是不是指老年代回收?新生代空间小,回收也一般比较快,也会这样吗?

637 阅读
请先登录,再评论

1.不论是G1还是CMS或者其他收集器,会不会动态调整其实还是看你参数的设置,如果你Xms和Xmx设置不一样的时候,JVM的有效内存是会动态扩容和缩容的,新生代与老年代的大小也会受一些参数如:MinHeapFreeRatio、MaxHeapFreeRatio等影响。
如果你显式的设置相关参数(如Xms与Xmx相同,设置Xmn等),那么一般就是固定大小。不过在这里需要注意的是,其他收集器动态改变新生代等大小的时候主要是根据内存的使用情况进行计算的,而G1在动态改变新生代大小的时候,是根据预测时间来进行导向的,根据预测时间与内存使用情况来进行一个计算。
这就导致了我们在设置G1参数的时候要注意,建议在使用G1时不要设置Xmx、NewSize、MaxNewSize、NewRatio等参数,如果设置了固定的新生代分区数,那么G1根据停顿时间动态调整新生代大小的功能就会失效,G1可能会不能满足预测时间停顿的要求。

2、3放在一起说,首先要搞明白G1垃圾回收的方式,G1分为YoungGC、MixedGC与FullGC。在你内存分配时如果剩余的空间不能满足要求,就会优先触发YoungGC,即新生代回收,此时需要收集的集合Collect Set是所有的Young的region。
而如果在YoungGC结束之后,如果满足并发标记的条件就会启动一个全局的并发标记。之后G1会在YoungGC与MixedGC之间视情况切换。MixedGC即混合GC,此时需要收集的集合Collect Set是所有的Young的region,外加根据global concurrent marking统计得出收集收益高的若干OldGen region,在用户指定的停顿时间范围内尽可能选择收益高的old gen region。
此刻我们就需要注意,为何G1的时间模型只是预测的,或者说是预期的,那是因为不论是YoungGC还是MixedGC,都需要收集整个的YoungGC,所以在时间设定过小时或者年轻代过大时,都无法达到预测的时间停顿,只是能尽可能的达到预测的时间停顿,这也是上面建议不要设置年轻代参数的部分原因。
至于FullGC,是MixedGC的回收也跟不上内存分配的速度,此时如果内存分配失败会进行失败处理,如果失败处理之后再次分配依然不成功那么才会进行FullGC。JDK10版本之前会启动一个串行的类似于SerialOld的收集器来收集整个Heap(全部的Young、Old),这个过程是很缓慢的,因为一开始设计者认为出现FullGC的情况就是你的参数设置不合理。而JDK10版本FullGC改为了并行的处理方式(类似于Parallel)。

31周前