垃圾收集器
1、Serial
-XX:+PrintCommandLineFlags
单线程,会停止用户线程
-XX:+UseSerialGC
收集时会停止用户线程,单线程收集,适合单核CPU
2、ParNew
相当于serial的多线程版本,适合多核cpu
-XX:+UseParNewGC
-XX:+UseParllelGCThreads 限制线程数量,默认开启和cpu数据相同的线程数
3、Parllel Scavenge
吞吐量优先的回收器
Parllel 收集器达到吞吐量优先的目的
高吞吐量可以高效的利用cpu,适合后台运行不需要太多交互的任务(批处理,订单处理,工支付,科学计算)
Parallel 收集器和Parllel Old 收集器的组合 在Java8中默认的收集器
-XX:+UseParallelGC
-XX:+UseParallelOldGC
Parallel old 采用标记-整理算法
4、CMS
-XX:+UseConcMarkSweepGC
并发-标记收集器
追求系统的低停顿时间
标记-清除算法
新生代采用:serial 或者ParNew 收集器
- 初始标记(会停止用户线程)
- 并发标记(用户线程和GC线程一起)
- 重新标记(stw)
- 标记清除
由于最耗时间的并发标记和并发标记清除阶段都不需要暂停工作,所以整体的回收停顿时间较短
采用标记清除算法会产生碎片
在并发清除的时候如果采用整理算法,原来的用户线程使用的内存还怎么用?要保证用户线程继续执行的前提下它运行的资源不受影响
CMS 的优缺点
优点: 并发收集,低延迟
缺点: 会产生碎片 ,CPU资源消耗严重,CMS服务处理浮动垃圾
浮动垃圾:并发阶段 如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象无法被及时回收
5、G1
-XX:+UseG1GC
Garbage-First 收集器
主要针对多核cpu和大容量内存的机器
jdk9 后默认的垃圾收集器
优势
-
不会产生碎片
CMS采用标记-清除算法,会产生碎片
G1将内存划分为一个个的region,内存的回收一region基本单位。Region之间采用复制算法
,
整体上可以看做标记-整理
算法
这两种算法避免内存碎片,有利于长时间运行,分配大对象不会因为没有找到内存空间提前触发一次gc -
可预测停顿时间 G1除了追求低停顿时间,还可以预测停顿时间模型
缺点
- G1占得内存,运行的额为负载要比CMS要高
总结
想最小的使用内存和并行开销----serial GC
想最大应用吞吐量 ----- parallel GC
最小的中断或停顿时间 --------- CMS