JVM垃圾收集器

2019-02-28  本文已影响0人  _情绪疯子

Scavenge GC(次收集)和 Full GC (全收集)的区别

新生代GC (Scavenge GC):Scavenge GC指发生在新生!代的 GC,因为新生代的 java对象多都是朝生夕死,所以 Scavenge GC 非常频繁,一般回收速度也比较快。当 Eden 空间不足以为对象分配内存时,会触发 Scavenge GC。
一般情况下,当心对象生成,并且在 Eden 申请空间失败时,就会触发 Scavenge GC,对 Eden 区域进行 GC,清除非存活对象,并且把尚且存活的对象移动到 Survivor 区。然后整理 Suervuvor 的两个去。这种方式的 GC 是对年轻代的 Eden 区不会分配的很大,所以 Eden 区的 GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,是 Eden 区能 尽快空闲出来
老年代 GC (Full GC/Major GC) :Full GC指发生在老年代的
GC,出现了 Full GC 一般会伴随着至少一次的 Major GC(老年代的对象大部分是 Minor GC 过程中从新生代进入老年代),比如:分配担保失败。Full GC 的速度一般会比 Minor GC 慢10倍以上。当老年代内存不足或者显示调用 Systen.gc() 方法时,会触发 Full GC。

次收集

当年轻代堆空间紧张时会被触发
相对于全收集而言,收集间隔较短

全收集

当老年代或者持久带堆空间满了,会触发收集操作
可以使用 System.gc() 方法来显示的启动全收集
全收集一般根据堆大小的不同,需要的时间不尽相同,但一般会比较长。不过,如果全收集时间超过 3 到 5 秒钟,那就太长了

分代垃圾收集器

young gereration(年轻代收集器):Serial 、 ParNew 、 Parallel scavenge
tenured gereration(老年代收集器也叫 old gereration): CMS(Coucurrent Mark Sweep)、 Serial Old 、 Parallel Old
年轻代以及老年代通用收集器:G1 (Gabage First)

分代垃圾收集器

新生代收集器

1、Serial(串行)收集器

   Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器;
   JDK1.3.1前是HotSpot新生代收集的唯一选择;

1、特点
①针对新生代;
②采用复制算法;
③单线程收集;
④进行垃圾收集时,必须暂停所有工作线程,直到完成; 即会"Stop The World";

Serial/Serial Old组合收集器运行示意图
2、应用场景
依然是HotSpot在Client模式下默认的新生代收集器;
也有优于其他收集器的地方:
简单高效(与其他收集器的单线程相比);
对于限定单个CPU的环境来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率;
在用户的桌面应用场景中,可用内存一般不大(几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的
3、设置参数
"-XX:+UseSerialGC":添加该参数来显式的使用串行垃圾收集器;
4、Stop TheWorld说明
JVM在后台自动发起和自动完成的,在用户不可见的情况下,把用户正常的工作线程全部停掉,即GC停顿;
会带给用户不良的体验;
从JDK1.3到现在,从Serial收集器-》Parallel收集器-》CMS-》G1,用户线程停顿时间不断缩短,但仍然无法完全消除;

2、ParNew(并行)收集器

  ParNew(并行)垃圾收集器是Serial收集器的多线程版本。

1、特点
除了多线程外,其余的行为、特点和Serial收集器一样;
如Serial收集器可用控制参数、收集算法、Stop The World、内存分配规则、回收策略等;
两个收集器共用了不少代码;

ParNew/Serial Old组合收集器运行示意图
2、应用场景
在Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作;
但在单个CPU环境中,不会比Serail收集器有更好的效果,因为存在线程交互开销。
3、设置参数
"-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器;
"-XX:+UseParNewGC":强制指定使用ParNew;
"-XX:ParallelGCThreads":指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
4、为什么只有ParNew能与CMS收集器配合
CMS是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作;
CMS作为老年代收集器,但却无法与JDK1.4已经存在的新生代收集器Parallel Scavenge配合工作;
因为Parallel Scavenge(以及G1)都没有使用传统的GC收集器代码框架,而另外独立实现;而其余几种收集器则共用了部分的框架代码;

3、Parallel Scavenge 收集器

与 ParNew 类似,Parallel Scavenge 也是使用复制算法,也是多并行多线程收集器,但与其他收集器关注尽可能缩短垃圾收集时间不同,Parallel Scavenge 更关注系统吞吐量
公式:
系统吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)
停顿时间越短就越适用于用户交互的程序,良好的额相应速度能提升用户的体验;而高吞吐量则适用于后台运算而不需要太多交互的任务,可以最高效率地利用cpu时间,尽快地完成程序的运算任务,Parallel Scavenge 提供了如下参数设置系统吞吐量

Parallel Scavenge 参数设置系统吞吐量 Parallel Scavenge 参数设置系统吞吐量

老年代收集器

1、Serial Old收集器

Serial,Parallel,CMS,G1四大GC收集器特点

1.Serial收集器
一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。
特点:CPU利用率最高,停顿时间即用户等待时间比较长。
适用场景:小型应用
通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

2.Parallel收集器
采用多线程来通过扫描并压缩堆
特点:停顿时间短,回收效率高,对吞吐量要求高。
适用场景:大型应用,科学计算,大规模数据采集等。
通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

3.CMS收集器
采用“标记-清除”算法实现,使用多线程的算法去扫描堆,对发现未使用的对象进行回收。
(1)初始标记
(2)并发标记
(3)并发预处理
(4)重新标记
(5)并发清除
(6)并发重置
特点:响应时间优先,减少垃圾收集停顿时间
适应场景:服务器、电信领域等。
通过JVM参数 -XX:+UseConcMarkSweepGC设置

4.G1收集器
在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。
特点:支持很大的堆,高吞吐量
--支持多CPU和垃圾回收线程
--在主线程暂停的情况下,使用并行收集
--在主线程运行的情况下,使用并发收集
实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收
通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

jvm结构图
上一篇下一篇

猜你喜欢

热点阅读