基本原理
G1 垃圾回收器是从 CMS回收器是基于分代理论和分块理论的基础上发展而来的。
- 分代:根据 java 对象的存活规律,氛围新生代和老年代,新生代采用复制算法,老年代使用标记-压缩算法或者标记-清除算法。
- 分区:将jvm 堆分为多个大小固定的区域,这样可以提升垃圾回收时候的并行数。
垃圾回收模式
G1 垃圾回收模式有两种:youngGC 和 mixedGC
- young GC:只回收新生代,采用复制算法
- mixed GC:回收新生代和一部分老年代
特点
1. 可控的垃圾回收时间
G1 垃圾回收器,由于将堆空间分成了大小固定的块,且支持只回收某几个块而不是全部块,所以可以通过确定回收的块数来满足垃圾回收的指定时间要求,这是其他垃圾回收算法都无法做到的。而且,垃圾最多的块会被优先回收,极大提升了垃圾回收效率,这也是它叫做 G1(garbage first)的原因。
2. 提升了新生代的垃圾回收速度
之前的垃圾回收器,对于新生代一般都是采用复制算法,G1 对于新生代也是采用复制算法,不过由于 G1 的堆内存被分成了大小固定的块,因此对新生代进行垃圾回收时,不仅可以想其他垃圾回收器一样可以并发标记垃圾,还能并发移动存活对象到新的块中,其他垃圾回收算法由于 S 区(survivors 区)是连续的内存,因此即便可以做到并发标记也无法做到并发移动。
适合的场景
G1 适合多核大内存的场景,而且是对可用性要求较高的场景。
调优思路
- 如果应用程序对相应时间要求较高,可以调小 GC 最大停顿时间。但如果大对象较多,则该调优思路就会失效,因为分块大小不能太小,但每次垃圾回收至少都得回收一个以上的块,如果回收一个块的时间都会大于用户设置的最小停顿时间,则最小停顿时间无法被保证。
- 对于大对象较多的批处理场景,可以同时调大分块大小和停顿时间。
网友评论