本文已参与「新人创作礼」活动,一起开启掘金创作之路。
JVM的垃圾收集器,也叫GC收集器,是学习JVM的必修课,也是程序员进阶的必经之路。 今天学习了比较前沿的垃圾收集器,G1,全称Garbage First,它是当前收集器技术发展最前沿成果之一。
该垃圾收集器内部采用的GC算法:标记整理
这里还涉及一个概念:分区region 。神马意思呢?G1收集器将整个java堆分成很多大小相同的region,新生代和老年代不再是物理隔阂,而是部分region的集合。jvm会维护一个优先队列,根据垃圾收集的价值进行排序,每次都优先收集排在前列的区域,这样可以保证在相同的时间内,达到最大的垃圾收集效果。
那么其处理过程是啥样的呢?
处理过程: 初始标记-并发标记-最终标记-筛选回收
1、初始标记
仅仅是标记GC Roots能直接关联的对象,速度很快。stop the word。一切都暂停吧,我要标记了。
2、并发标记
从GC Roots出发,对堆中对象进行可达性分析,找出存活对象,该阶段耗时较长,但是可与用户线程并发执行。这阶段会找出所有与根对象直接或者间接相关的对象。与GC Roots有联系的,就等于有了免死金牌,不怕GC了。
3、最终标记
主要修正在并发标记阶段因为用户线程继续运行而导致标记记录产生变动的那一部分对象的标记记录。stop the word。一切都暂停吧,我要修正记录了。
4、筛选阶段
将各个region分区的回收价值和成本进行排序,根据用户所期望的停顿时间制定回收计划。这阶段停顿用户线程。stop the word。
过程了解了,下面对其进行总结:
优点:
- 并行并发
- 可以分代收集,在年轻代和老年代采用不同的算法处理不同的对象。
- 空间整合。标记整理算法意味着不会产生内存碎片。
- 可预测的停顿时间。
思考:
为什么可预测?因为G1避免了整个java堆的全区域收集。G1会统计每个region的回收价值和成本,维护一个优先列表,优先回收价值最大的region。这样可以保证在有限的时间内,获得最大的回收效率。
缺点:还不够成熟,还没有经过真正的实际考验