垃圾收集器
Serial收集器
1.最基本,发展最悠久
2.单线程垃圾收集器(必须暂停其他所有户用线程)
3.应用场景:客户端模式下的虚拟机(用户桌面应用场景、部分微服务应用)
ParNew收集器
1.多线程垃圾收集器
2.只有它能与CMS收集器配合工作
3.VM Args:-XX:ParallelGCThreads(限制垃圾收集的线程数(默认是处理器核心数))
Parallel Scavenge收集器
1.新生代收集器(标记-复制算法)、并行收集的多线程收集器
2.关注点:可控制的吞吐量(运行乎用户代码时间 / 运行用户代码时间 + 运行垃圾收集时间)
3.使用场景:后台运算的分析任务
4.VM Args
-XX:MaxGCPauseMillis(控制最大垃圾收集停顿时间)
-XX:GCTimeRatio(设置吞吐量大小,即垃圾收集占总时间的比率)
-XX:+UseAdaptiveSizePolicy(开启之后不需要设置新生代大小 -Xmn、Eden与Survivor的比例 -XX:SurvivorRatio、晋升老年代对象的大小 -XX:PretenureSizeThreshold)
Serial Old收集器
1.Serial 老年代收集器
2.与Parallel Scavenge搭配
Parallel Old收集器
Parallel Scavenge老年代收集器
CMS(Concurrent Mark Sweep)收集器
1.老年代收集器
2.四个阶段
初始标记(CMS initial mark):标记GC Roots能直接关联的对象,时间短,用户线程停顿
并发标记(CMS concurrent mark):GC Roots直接关联对象向下遍历整个对象图,时间长,不需要用户线程停顿
重新标记(CMS remark):为了修正并发标记期间,导致标记发生变动的对象标记记录,时间短,用户线程停顿
并发清理(CMS concurrent sweep):清理删除掉标记阶段判断已经死亡的对象
3.优点
并发收集
低停顿
4.缺点
对处理器资源要求高,并发处理会占用一部分线程(默认回收线程数:(处理器核心数量) + 3 / 4)
无法处理浮动垃圾(Floating Garbage):并发标记、并发清理阶段,用户线程一直在执行,会产生新的垃圾,需要预留一部分内存
预留内存不满足时,出现Concurrent Mode Failure:暂停用户线程, 启动Serial Old收集器
标记-清除算法,产生空间碎片
5.VM Args:-XX:CMSInitiatingOccupancyFraction(设置CMS触发内存百分比)
G1(Garbage First)收集器
1.服务端应用收集器(面向堆内存任何部分来组成回收集:Collection Set)
2.四个阶段
初始标记(Initial Marking):记录GC Roots直接关联到的对象,并修改TAMS指针
并发标记(Concurrent Marking):遍历整个GC Roots直接关联的对象下的对象图,并标记,重新处理SATB记录下并发标记过程中出现引用变动的对象
最终标记(Fianl Marking):补充SATB记录下并发标记过程中出现引用变动的对象
筛选回收(Live Data Counting and Evacuation):根据停顿预测时间来觉得回收多个Region区域
3.内存布局
独立区域(Region):每个Region赋予角色(新生代的Eden空间、Survivor空间、老年代空间),每个角色的Region采用不同的垃圾回收算法
TAMS(Top at Mark Strar)指针:每个Region单独划分出的一块空间,用于在并发回收过程中新对象的分配
Humongous Regoin:专门存储大对象(超过Region容量的一半)
4.问题
跨Region引用对象:使用记忆集(卡表)的方式,存储结构:哈希表(Key:别的Region的起始地址,Value:集合(卡表的索引号))
并发标记时收集线程与用户线程互不干扰:原始快照(SATB),TAMS(Top at Mark Strar)指针
可靠的停顿预测模型:衰减均值(Decaying Average)(个人感觉类似中位数),记录每个Region的回收耗时、每个Region记忆集里的脏卡数量,分析出平均值、标准偏差、置信度
5:VM Args
-XX:+UseConcMarkSweepGC(开启)
-XX:G1HeapRegionSize(设置Region的大小,2的N次幂)
-XX:MaxGCPauseMillis(设置允许的收集停顿时间)
低延迟垃圾收集器(Low-Latency Garbage Collector)
衡量垃圾收集器的指标
1.内存占用(Footprint)
2.吞吐量(Throughput)
3.延迟(Latency)
各款收集器的并发情况
Shenandoah收集器
1.回收阶段与用户线程并发执行
2.不适用分代收集:连接矩阵(Connection Matrix)二维表格
全局数据结构记录跨Region的引用关系,降低了维护每个Region记忆集的消耗,也降低了伪共享的概率。
3.九个阶段
初始标记(Initial Marking):标记与GC Roots直接关联的对象(停顿)
并发标记(Concurrent Marking):遍历与GC Roots直接关联的对象向下的对象图
最终标记(Final Marking):处理剩余的SATB扫描,统计出回收价值最高的Region(停顿)
并发清理(Concurrent Cleanup):清理没有存活对象的Region(Immediate Garbage Region)
并发回收(Concurrent Evacuation):不停顿,通过读屏障和转发指针(Brooks Pointers)解决并发情况下的移动对象的问题
初始引用更新(Initial Update Reference):确保所有并发回收阶段的收集器线程都已完成对象移动人物(线程集合点)(停顿)
并发引用更新(Concurrent Update Reference):更新所有指向旧对象的引用改为复制后的新地址
最终引用更新(Final Update Reference):修改GC Roots中引用地址的变更(停顿)
并发清理(Concurrent Cleanup):回收所有无存活对象的Region内存空间,供新对象分配使用
4.转发指针(Brooks Pointers)——类似于句柄访问对象
在对象前增加一个新的引用字段,不并发移动对象时,指向自己,并发移动时指向新地址的引用
多线程竞争:CAS
执行频率
ZGC收集器
1.Region内存布局,不设分代,使用读屏障、染色指针和内存多重影响实现可并发的标记-整理算法
2.内存布局:可动态创建和销毁,动态区域容量大小
小型Region(Small Region):2MB,存放小于256KB的对象
中兴Region(Medium Region):32MB,存放256KB-4MB的对象
大型Region(Large Region):存放4MB以上的大对象,每个region只存放一个大对象
4.染色指针(Colored Pointer)
标记信息记录在对象的指针上
对象的三色标记状态、是否进入了被移动过,是否只能通过finalize()方法才能访问
5.优势
存活对象被移动之后,该Region可以立即被释放和重用
减少在垃圾收集过程中内存屏障的使用
可扩展的的存储结构来记录更多与对象标记、重定位相关的数据
6.劣势(64位操作系统):
并不是所有的操作系统、处理器都支持,因为改变了内存的寻址地址
虚拟内存映射
7.四大阶段:
并发标记(Concurrent Mark):遍历对象图做可达性分析,标记阶段更新染色指针的Marked 0、Marked 1标志位。
并发预备冲分配(Concurrent Prepare for Relocate):统计出本次收集过程要清理的Region,并组成重分配集(存活对象被重新复制到其他Region,当前Region的释放,类卸载,弱引用处理)
并发重分配(Concurrent Relocate):
执行把预备阶段组成的重分配集中存活的对象复制到新的Region中
为重分配集中每个Region维护一个转发表,记录从旧对象到新对象的转向关系(用户线程并发访问位于重分配集中的对象时,被预置的内存屏障截获,根据转发表中的转向关系转发到新对象上,并同时修正该引用的值指向新对象)。
并发重映射(Concurrent Remap):修正整个堆中指向重分配集中旧对象的所有引用。