一.垃圾收集算法
1.标记-清除
2.复制算法
3.标记-整理
4.分代收集
二.垃圾收集器
1.Serial收集器 使用复制算法 新生代 单线程
2.ParNew收集器 使用复制算法 新生代 并行
3.Parallel Scavenge收集器(吞吐量收集器) 复制算法 新生代 并行
a.-XX:MaxGCPauseMillis 最大垃圾收集停顿时间
b.-XX:GCTimeRatio 吞吐量大小 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
c.-XX:+UseAdaptiveSizePolicy 动态调整停顿时间这是一个开关参数,打开之后就不必设置新生代(-Xmn),Eden和Survivord区得比例(-XX:SurivorRatio)晋升老年代对象年龄(-XX:PretenureSizeThreshold)参数了.
4.Serial Old收集器 标记-整理算法 老年代 单线程
5.CMS收集器 最短回收停顿时间为目标得收集器,注重响应速度(并发收集低停顿) 标记-清除算法
i-CMS增量式并发收集器
收集过程
a.初始标记
b.并发标记
c.重新标记
d.并发清除
初始标记和重新标记需要stop the world初始标记仅仅只是标记一下GC Roots能直接关联到得对象速度很快,并发标记阶段就是进行GC Roots Tracing 得过程,而重新标记则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动得那一部分对象得标记记录这个阶段得停顿时间一般会比初始标记阶段稍长一些,但远比并发标记得时间短。
但使用标记-清除算法实现会产生大量空间碎片无连续大空间内存,so当给大对象分配空间时找不到连续空间也分配则会提前触发Full GC。
-XX:+UseCMSCompactAtFullCollection开关用于在full gc后对空间碎片进行整理但是会造成停顿时间变长so又提供了
-XX:CMSFullGCsBeforeCompaction参数来设置执行多少次不压缩得full gc后跟着来一次带压缩得。
CMS默认启动回收线程(CPU数量+3)/4
5.G1收集器(不牺牲吞吐量得前提下完成低停顿得内存回收)
基于标记-整理算法实现得收集器不会产生空间碎片可以非常精确得控制停顿可以指定在一个长度为M毫秒得时间片段内消耗在垃圾收集上得时间不得超过N毫秒.
G1将整个java堆(包括新生代老年代)划分为多个大小固定得独立区域并跟踪其垃圾堆积程度,在后台维护一个优先列表每次根据允许得收集时间,优化回收垃圾最多得区域。区域划分既有优先级得区域回收保证了G1收集器在有限得时间内可以获得最高得收集效率.
三.垃圾收集参数总结
-Xnoclassgc
-verbose:class
-XX:+TraceClassLoading 类加载信息
-XX:+TraceClassUnLoading 类卸载信息
-XX:SurvivorRatio
-XX:PretenureSizeThreshold
-XX:HandlePromotionFailure
-XX:+UseParNewGC 强制使用parNew收集器在新生代回收空间
-XX:+PrintGCDetails 打印回收详情
-XX:UseConcMarkSweepGC
-XX:ParallelGCThreads 限制垃圾收集得线城数