G1垃圾回收器详细原理可以看其他人的文章。
四个特点
特点一:少量STW时间,高吞吐量
特点二: 支持大堆,一个收集器解决堆内存的回收。
特点三: 避免内存碎片
特点四:可预测的停顿时间
上述四个特点是依靠什么原理来达成的呢?
特点一:少量STW时间,高吞吐量
G1在CMS基础上取长补短,站在巨人肩上,自然就比巨人更高。具体就是CMS过程是
初-并-重-并,G1是初-并-最-筛。筛可以并发不STW,但是G1采用了STW,筛选活跃对象最小的region进行回收(关键,并不是全量回收),STW之后,利用多核并行处理。
特点二: 支持大堆,一个收集器解决堆内存的回收。
G1收集器将java堆划分为一个个相等大小的region,可以搞定整个java堆。之前收集器需要新生代老年代不同的收集器配合(CMS+PRANEW )。
支持大堆的原理可能跟筛选回收有关,当堆超过8G之后继续增大,之前的垃圾回收器回收整个老年代或者新生代的效率会降低。而G1可以只挑那些回收效率高的Region进行回收。堆不管多大,我只回收那些少量值得回收的区域。数据表明,4G以下堆内存适合parallel old
4G-8G适合CMS,大于8G可以考虑G1。(不是必须)
特点三: 避免内存碎片
G1本质上是基于“标记-整理”的收集方式
局部的两个Region是采用复制的方式。
特点四:可预测的停顿时间
这个依赖的就是G1会维护一个优先列表,根据配置的时间,尽量只回收那些高优先级的Region。
CMS中,可能存在跨代引用,G1中也可能存在跨Region引用,为了避免全局扫描。每个Region都会维护一个Rememberd Set,来标记引用关系。region被清理的时候,Rememberd Set同时被清理
网友评论