串行回收器:
-- 古老、稳定、效率高、
单线程回收
-- 可能产生较长停顿
-- 开启使用:-XX:+UseSerialGC
-- 使用场所:新生代(复制算法)、老年代(
标记-压缩)
并行回收器:
--
多线程(不一定快,单核CPU不会变快,切换线程上下文需要时间)
--
标记-压缩算法
-- 开启使用:
新生代并行收集器
parNew:
-XX:+UseParNewGC 新生代使用并行,老年代使用串行
需要多核支持
Parallel收集器
ParallelGC:
-XX:+UseParallelGC 新生代使用并行,老年代使用串行
-XX:+UseParallelOldGC 新生代使用并行,老年代使用并行
并发收集器(CMS)
--
并发的标记清除算法(产生碎片)
-- 理论上
GC和应用程序同时执行,不会停顿
-- 停顿减少,吞吐量减少(CPU要一边分配资源给应用程序,一边分配资源给GC)、清理不彻底(用户一边产生垃圾,一边清理)、产生内存碎片
-- 用于
老年代
-- 算法步骤:
1.初始标记
产生全局停顿,速度快,跟对象能直接关联的对象都标记
2.并发标记
和应用程序线程一起
并发执行,标记所有关联对象
3.重新标记
产生全局停顿,速度快
,修正标记
4.并发清除
和应用程序线程一起并发执行,清除未标记对象
5.整理碎片
产生全局停顿,可能时间长,整理内存碎片
并发收集器(G1)
-- 使用:
XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=200
其中-XX:+UseG1GC为开启G1垃圾收集器,-Xmx32g 设计堆内存的最大内存为32G,-XX:MaxGCPauseMillis=200设置GC的最大暂停时间为200ms。
-- 分代回收(eden、survivor、tunured区再细分,加上
humongous区)
-- 理论上GC和应用程序同时执行,不会停顿
-- 新生代GC仍然全局暂停,老年代GC通过移动内存块进行回收,避免了内存碎片
--
巨型对象放在humongous区
G1的两种模式:
1.G1 young GC(对eden区进行GC,survivor区from到to,to到tunured,最终eden为空)
2.G1 Mix GC(对新生代、老年代进行GC)
全局并发标记、拷贝存活对象、三色标记扫描引用
由于并发执行,容易产生引用扫描错漏,引进修改记录