JVM垃圾回收
GC和分代回收算法
GC的目的:
实现无用对象内存自动释放,减少内存碎片,加快分配速度。
GC要点:
1.回收区域是堆内存,不包括虚拟机栈,在方法调用结束会自动释放方法占用的内存。
2.判断无用对象,使用可达性分析算法,三色表记法标记存活对象,回收未标记对象。
3.GC具体的实现称为垃圾回收器。
4.GC大都采用分代回收思想,理论依据是大部分对象朝生夕死,用完就立刻可以回收,另有少部分对象会长时间存活,每次很难回收,根据这两类对象的特性将回收区域分为新生代和老年代,不同区域应用不同回收策略。
5.根据GC的规模可分成Minor GC(小范围垃圾回收,新生代),Mixed GC(混合收集,新生代和部分老年代被回收),Full GC(全面回收,新生代与老年代内存全部不足,停顿明显)。
分代回收
1.伊甸园eden,最初对象诞生在这里。与幸存区合称新生代。
2.幸存区survivor,当伊甸园内存不足,回收的幸存对象到这里,分成from和to,采用标记复制法。
3.老年代old,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)。
GC规模
1.Minor GC(小范围垃圾回收):发生在新生代的垃圾回收,暂停时间短。
2.Mixed GC(混合收集):新生代+老年代部分区域的垃圾回收,G1收集器特有。
3.Full GC(全面回收):新生代+老年代完整垃圾回收,暂停时间长,应尽力避免。
三色标记问题
用三种颜色记录对象的标记状态。
黑:已标记 灰:标记中 白:还未标记
最后黑色对象保留,白色对象作为垃圾回收。
并发漏标问题
漏标问题-----记录标记过程中变化
1.Incremental Update 增量更新
1.监控所有的赋值动作。只要赋值发生,被赋值的对象就会被记录。然后进行重新标记。
2.Snapshot At The Beginning,SATB 原始快照
1.新加对象会被记录
2.被删除引用关系的对象也被记录
垃圾回收器
1.新生代eden内存不足发生Minor GC,标记复制算法STW
2.老年代old内存不足发生Full GC,时间长,标记整理算法STW
3.使用场景:注重吞吐量的应用程序(不注重响应时间)
ConcurrentMarkSweep GC 并发标记GC
1.老年代标记阶段并发标记,重新标记时需要暂停STW,并发清除。(标记+清除算法,有内存碎片)
2.Failback Full GC。并发失败的时候会触发Full GC。
3.使用场景:注重响应时间
垃圾回收器G1
1.响应时间与吞吐量兼顾
2.将整个堆内存划分为多个区域,每个区域都可以充当伊甸园区、幸存区,老年代,专门用来存储大对象的空间。
工作流程:
1.新生代回收:伊甸园区空间不足,标记复制
2.并发标记:老年代并发标记,重新标记时需要STW。
3.混合收集:并发标记完成,开始混合收集,参与复制的有伊甸园、幸存区、老年区,其中老年区会根据暂停时间目标,选择部分回收价值高的区域,复制时STW
4.Failback Full GC。