一、串行:垃圾回收器(sgc)
1、 串行垃圾回收在进行垃圾回收时,他会持有所有应用程序的线程,冻结所有应用程序线程,使 ,用单个垃圾回收线程来进行垃圾回收
串行垃圾回收器时为单线程环境而设计的,如果你的程序不需要多线程,启动串行垃圾回收
2、串行收集器时最古老的,最稳定以及效率最高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代,老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集过程中会暂停服务(stop the world)
使用方法 -xx:+UseSerialGc 串联收集
ps:在jsk clien模式 不指定vm参数 默认串行垃圾回收器
二、串行:parNew收集器
parNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩
使用方法 -xx:+UseParNewGC ParNew 收集器
-xx:ParalleGCThreads 限制线程数量
三、并行:Parallel收集器
Parallerl Scavenge收集器类似ParNew收集器,Paraller收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统运行情况是u及性能监控信息,动态调整这些参数以提供最适合的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于毫秒或者比例;新生代复制suanfa、老年代标记-压缩
使用方法: -xx+UseParallerIGC 使用Paralle收集器+老年代串行
四、并行:Parallel Old收集器
Parallel Old 时Parallel Scavenge收集器的老年代版本,使用线程和‘标记-整理’算法。这个收集器时在jgk1.6中才提供的
使用方法:-xx:+UseParallerlOldGC使用Parallel收集器+老年代并行
五、并发标记扫描cms收集器
cms收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应数速度,希望系统停顿时间最短,以给用户带来较好的体验
优点:并发收集、低停顿
缺点:产生大量空间碎片,并发阶段降低吞吐量
垃圾回收器的选用决定因素:
1、应用程序的场景
2、硬件的制约
3、吞吐量的需求
串行垃圾回收是最简单的也是效率最低的,如果只是控制台的单线程程序,简单任务,并且机器配置不高,推荐使用。并行垃圾回收器是64bit server默认的垃圾回收器,一般我们工作和生产上默认不配置,都是并行垃圾回收。对于一般的不要求吞吐的应用,并且硬件资源不是太充足的情况下,并行垃圾回收器差不多能满足需求。CMS垃圾回收器是对并行垃圾回收器的一个优化,它以CPU和系统资源为代价,换取GC的延迟。不会一GC就STW,而是根据情况STW。一定程度上是资源换取速度。G1垃圾回收器是针对于大heap的垃圾回收器,如果heap分配的足够大,分的region的优先级回收策略会优先清理垃圾多的region.并且减少了内存空间碎片,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。
垃圾回收器目前分为6种类型, 串行,并行,并发标记,G1。
小数据量和小型应用,使用串行垃圾回收器即可。
对于对响应时间无特殊要求的,可以使用并行垃圾回收器和并发标记垃圾回收器。(中大型应用)
对于heap可以分配很大的中大型应用,使用G1垃圾回收器比较好,进一步优化和减少了GC暂停时间。
没有银弹,针对不同的场景,选用不同的垃圾回收器。
流行的组合
Serial
ParNew + CMS
ParallelYoung + ParallelOld
G1GC