垃圾回收及收集器的浅析与总结
垃圾回收
如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。
引用
强引用:普遍存在的引用赋值。
弱引用:有用,但不是必须的对象。第二次回收。
软引用:非必须。第一次回收。
虚引用:无影响。只为回收时通知。
分代收集
弱分代(新生代):很快被垃圾收集。
强分代(老年代):从多次垃圾收集中存活。
跨代引用:相互引用的关系,会倾向于共存亡。使用记忆集表示出老年代的哪一部分被跨代使用
标记清除算法
标记出要回收的对象。统一回收标记的对象
缺点
1.效率不稳定。数量越多,标记清除效率越低。
2.空间碎片化
标记-复制算法
划分一半的区域,每次使用一般区域。一块内存使用完,将存活对象按顺序复制到另一部分。.清除原来部分内存。
缺点
空间浪费
标记-整理算法
标记出要回收的对象,将存活对象整理到存储空间一端。清理掉边界外的内存
缺点
全程暂停用户应用程序
HotSopt的算法
根节点枚举
HotSpot使用OopMap数据结构确定对象引用。
安全点
开始垃圾收集的时间。分为抢先式中断和主动式中断
安全区域
对于没有分配处理器时间的程序,使用安全区域:扩展拉伸的安全点
记忆集和卡表
记忆集:记录非回收区域指向回收区域的指针集合的数据结构
卡表:记忆集的实现。指向卡页。元素变脏即对这一部分的卡页进行查找。
写屏障
使元素变脏的方法。分为前/后屏障。
三色标记
并发可达性的实现与优化。增量更新和原始快照解决对象消失问题。
垃圾收集器
Serial
ParNew
Parallel Scavenge收集器
与ParNew相似。目标:可控制的吞吐量
Serial Old
Parallel Old
CMS收集器
1.初始标记(CMS initial mark):标记GC Roots
2.并发标记(CMS concurrent mark):遍历图
3.重新标记(CMS remark):修正并发标记期间的变动
4.并发清除(CMS concurrent sweep):清除标记的对象
Garbage First收集器
把Java堆划分为多个大小相等的Region,其中包含Humongous区域,存放大对象(Region的一半)。
根据各个region里面回收获得的空间大小和所需时间进行回收。优先处理收益最大的。
快Region引用对象:记忆集
低延迟垃圾收集器
Shenandoah收集器
G1继承者。
不同处
支持并发整理算法。
没有实现分代。
使用“连接矩阵”记录跨Region关系。
ZGC收集器
基于Region,但Region能够动态创建和销毁,容量也为动态。
垃圾收集器的选择
1.应用程序的关注点
2.运行程序的基础设施
3.使用JDK的发行商