【JVM】程序员进阶JVM(三)——7大 垃圾回收算器

一、前言

      前几篇博客,小编向大家介绍了JVM的一些基本知识,包括JVM的运行时的内存结构,以及JVM是通过哪些算法回收对象,Jvm是通过哪些算法回收来判断出某些对象是可以回收的。而这些回收的工作都是垃圾回收器来完成的。

      在这篇博客中,小编就从虚拟到现实,向大家介绍几款垃圾回收器。

二、垃圾回收器宏观介绍

      学习回收器,思维导图先行:

      这里呢,我们讨论的是JDK1.7 以后的HotSpot虚拟机中的垃圾收集器,主要是因为在JDK1.7 以后添加了G1回收器。

这里写图片描述

      在HotSpot的JVM虚拟机中,有7种垃圾回收器。这其中垃圾回收器也是从一代一代改进来的。当然垃圾回收处理的STW的停顿时间也越来越短。效率越来越高。因为我们的堆中,分了年轻代和老年代。每一个部分中用的内存收集算法是不一样的。针对不同的回收算法就设置了不同的垃圾收集器。

这里写图片描述

三、各种垃圾收集器


3.1 Serial

      新生代收集器,可以说Serial是最基础的收集器。

      看到Serial就经常相当序列化接口Serializable。虽然这两个之间没有任何关系,就是名字相似罢了。

扫描二维码关注公众号,回复: 1712557 查看本文章

      再说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操作,并发执行。

  • 分代收集

  • 空间整合:整体上基于标记-整理算法,局部上是基于复制算法实现,不会产生内存碎片。

  • 可预测的停顿

四、小结

      通过对这些垃圾收集器的理解,对比。相信可以更好的处理这些问题。也希望可以给您带来帮助。打开语音,多多交流。

猜你喜欢

转载自blog.csdn.net/kisscatforever/article/details/80722643
今日推荐