垃圾收集器ParNew&三色标记法
1. 垃圾收集算法
1.1 分代收集理论
1.2标记-复制算法:
概念
缺点:浪费空间
1.3.标记-清除算法:
概念:
缺点:
1效率问题(如果需要标记的对象太多,效率不高)
2.空间问题(标记清除后会产生大量不连续的碎片)
1.4标记-整理算法
概念:
缺点:
1.清理内存碎片需要时间
垃圾收集器
收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
1.1Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)
1.2ParallelScavenge收集器(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)
1.3ParNew收集器(-XX:+UseParNewGC))
ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用。
新生代采用复制算法,老年代采用标记-整理算法。
1.4CMS收集器(-XX:+UseConcMarkSweepGC(old))
CMS(ConcurrentMarkSweep)
优点:
缺点:
收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体
验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,
它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
从名字中的MarkSweep这两个词可以看出,CMS收集器是一种“标记-清除”算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。
整个过程分为四个步骤:
初始标记:
暂停所有的其他线程(STW),并记录下gc,roots直接能引用的对象,速度很快。
并发标记:
并发标记阶段就是从GCRoots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。因为用户程序继续运行,可能会有导致已经标记过的对象状态发生改变。
重新标记:
并发清理:
并发重置:
核心参数配置:
1-XX:+UseConcMarkSweepGC:启用cms
2.-XX:ConcGCThreads:并发的GC线程数
3.-XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)
4.-XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次
5.-XX:CMSInitiatingOccupancyFraction:当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比)
6.-XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
7.-XX:+CMSScavengeBeforeRemark:在CMSGC前启动一次minorgc,目的在于减少老年代对年轻代的引用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时80%都在标记阶段
8.-XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW
9.-XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;
垃圾收集底层算法实现
三色标记:
黑:有引用
灰:存在引用,中间态状态
白:无引用
多标-浮动垃圾
漏标-读写屏障:有两种解决方案:增量更新(IncrementalUpdate)和原始快照(SnapshotAtTheBeginning,SATB)
增量更新:引用赋值給新对象的时候,记录下来这些引用。在重新标记扫描(重新标记会STW)
原始快照:引用被删除之后,记录下来这些引用,这些引用标记为黑色,代表有引用不能被删除,所以会导致浮动垃圾,下个gc会清理
写屏障:类似AOP的代码,跟内存屏障不一样
读屏障:
CMS:增量更新
G1:原始快照 SATB