【JVM】程序员进阶JVM(三)——7大 垃圾回收算器
一、前言
前几篇博客,小编向大家介绍了JVM的一些基本知识,包括JVM的运行时的内存结构,以及JVM是通过哪些算法回收对象,Jvm是通过哪些算法回收来判断出某些对象是可以回收的。而这些回收的工作都是垃圾回收器来完成的。
在这篇博客中,小编就从虚拟到现实,向大家介绍几款垃圾回收器。
二、垃圾回收器宏观介绍
学习回收器,思维导图先行:
这里呢,我们讨论的是JDK1.7 以后的HotSpot虚拟机中的垃圾收集器,主要是因为在JDK1.7 以后添加了G1回收器。
在HotSpot的JVM虚拟机中,有7种垃圾回收器。这其中垃圾回收器也是从一代一代改进来的。当然垃圾回收处理的STW的停顿时间也越来越短。效率越来越高。因为我们的堆中,分了年轻代和老年代。每一个部分中用的内存收集算法是不一样的。针对不同的回收算法就设置了不同的垃圾收集器。
三、各种垃圾收集器
3.1 Serial
新生代收集器,可以说Serial是最基础的收集器。
看到Serial就经常相当序列化接口Serializable。虽然这两个之间没有任何关系,就是名字相似罢了。
再说Serial收集器,有下面的特点:
- 单线程,当他收集内存的时候,所有其他的线程都要等待,直到他完成。
- 复制算法
ParNew
新生代收集器,可以说ParNew是Serial的一个多线程版本。
特点:
- 多线程
- 复制算法
- 回收的时候暂停所有用户的线程
- 只能配合CMS工作
Parallel Seaverage
新生代收集器,多线程,复制算法,更加关注吞吐量。
特点:
- 多线程
- 复制算法
- 可控制的吞吐量
- 自适应调节策略
吞吐量 = 用户代码运行时间/(用户代码运行时间+垃圾回收时间)
eg: 虚拟机运行用户代码时间为99 ,垃圾回收为1 ,则吞吐量为99/(99+1)=99%
自适应调节策略:UseAdaptiveSizePolicy参数,这个参数打开后,不用手动设置Eden和s1、s2的大小比例,收集器会根据当前虚拟机运行情况收集性能监控信息,动态的调整这些参数以供最合适的停顿时间和最大的吞吐量。
可以说,自适应调节策略是Parallel Scaverage和ParNew的主要区别。
Serial Old
老年代回收器。是一个单线程,使用标记-整理算法的垃圾收集器。
特点:
- 单线程
- 标记-整理算法
- 暂停所有用户线程
Parallel Old
老年代收集器。是Parallel Scaverage的老年代版本。使用多线程和标记-整理算法。
特点:
- 多线程
- 标记-整理算法
CMS
老年代收集器。
Concurrent Mark Sweep,是一种获取最短停顿时间为目标的回收器。现在很多业务场合都要求挺短时间短,CMS非常适合这种业务场景。
从Mark Sweep可以看出,这是一种标记清除算法,步骤:
1.初始标记
2.并发标记
3.重新标记
4.并发清除
特点:
- 多线程
- 标记清除算法
- 对CPU资源敏感
- 尽可能小的缩短停顿时间
- 无法处理浮动垃圾
- 产生内存碎片
G1
G1垃圾收集器是面向服务端应用的垃圾收集器。在垃圾收集过程中,是可以替换掉CMS的
特点:
- 并行与并发:充分利用cpu,缩短STW停顿时间,不用停顿GC操作,并发执行。
- 分代收集
- 空间整合:整体上基于标记-整理算法,局部上是基于复制算法实现,不会产生内存碎片。
- 可预测的停顿
四、小结
通过对这些垃圾收集器的理解,对比。相信可以更好的处理这些问题。也希望可以给您带来帮助。打开语音,多多交流。
还没有评论,来说两句吧...