文章目录

  • 0 垃圾收集算法与垃圾收集器的关系
  • 查看默认的jvm垃圾回收器
  • jvm默认的垃圾回收器(7种)
  • 部分参数说明
  • JVM中的Server/Client模式
  • 1 串行GC(Serial)/(Serial Copying)
  • 2 并行GC(ParNew)
  • 3 并行回收GC(Parallel)/(Parallel Scavenge)
  • 4 并行GC(Parallel Old)/(Parallel MSC)
  • 5 CMS收集器
  • 6 串行GC(Serial Old)/(Serial MSC)
  • 如何选择垃圾收集器
  • 7 G1收集器


0 垃圾收集算法与垃圾收集器的关系

  • 垃圾收集算法是内存回收的方法垃圾收集器是内存回收的具体实现
  • 因为目前为止还没有完美的收集器出现。更加没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集。
  • 四种主要的垃圾收集器。Serial(串行)、Parallel(并行)、CMS(并发标记清除)、G1

查看默认的jvm垃圾回收器

java -XX:+PrintCommandLineFlags -version

jvm默认的垃圾回收器(7种)

UseSerialOldGC(MSC)(淘汰), UseSerialGCUseParallelGCUseConcMarkSweepGCUseParNewGCUseParallelOldGCUseG1GC

java中垃圾收集 java垃圾收集器种类_jvm


java中垃圾收集 java垃圾收集器种类_CMS_02

  • 一般年轻代用复制算法,老年代用标记清除或者标记整理算法

部分参数说明

  • DefNew:Default New Generation
  • Tenured:Old
  • ParNew:Parallel New Generation
  • PSYoungGen:Parallel Scavenge
  • ParOldGen:Parallel Old Generation

JVM中的Server/Client模式

java中垃圾收集 java垃圾收集器种类_jvm_03

1 串行GC(Serial)/(Serial Copying)

java中垃圾收集 java垃圾收集器种类_CMS_04

  • Serial(串行)收集器是一个单线程收集器。新生代采用复制算法、老年代采用标记-整理算法。
  • 为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,不适合服务器环境。

java中垃圾收集 java垃圾收集器种类_垃圾收集器_05

2 并行GC(ParNew)

java中垃圾收集 java垃圾收集器种类_jvm_06

  • ParNew收集器是Serial的多线程版本。新生代采用复制算法、老年代采用标记-整理算法。

java中垃圾收集 java垃圾收集器种类_CMS_07

3 并行回收GC(Parallel)/(Parallel Scavenge)

java中垃圾收集 java垃圾收集器种类_jvm_08

  • Parallel Scavenge收集器类似ParNew,也是一个新生代垃圾收集器,使用复制算法,也是一个并行的多线程的垃圾收集器,俗称吞吐最优先收集器。一句话:串行收集器在新生代和老年代的并行化
  • 新生代采用复制算法、老年代采用标记-整理算法。
  • 多个垃圾收集线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据首台处理等弱交互场景(跟前台交互不强)。
  • Parallel Scavenge收集器关注点是吞吐量,即CPU中运行用户代码的时间与CPU总消耗时间的比值。

java中垃圾收集 java垃圾收集器种类_CMS_09

4 并行GC(Parallel Old)/(Parallel MSC)

java中垃圾收集 java垃圾收集器种类_CMS_10

5 CMS收集器

java中垃圾收集 java垃圾收集器种类_jvm_11

  • 4步过程
    (1)初始标记(CMS initial mark)。只是标记一下GC Roots能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。
    (2)并发标记(CMS concurrent mark)和用户线程一起。进行GC Roots跟踪的过程,和用户线程一起工作,不需要暂停工作线程。主要标记过程,标记全部对象。
    (3)重新标记(CMS remark) 。为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正。
    (4)并发清除(CMS concurrent sweep)和用户线程一起。清除GC Roots不可达对象,和用户线程一起工作,不需要暂停工作线程。基于标记结果,直接清理对象。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户线程一起并发工作,所以总体上来看CMS收集器的内存回收和用户线程是一起并发地执行。
  • CMS收集器关注点是减少回收停顿时间,更注重用户体验。采用标记-清除算法。
  • java中垃圾收集 java垃圾收集器种类_垃圾收集_12


  • java中垃圾收集 java垃圾收集器种类_垃圾收集器_13

  • CMS优点:并发收集低停顿
  • CMS缺点:并发执行,对CPU资源压力大
  • java中垃圾收集 java垃圾收集器种类_垃圾收集_14

  • CMS缺点:采用的标记清除算法会导致大量碎片
  • java中垃圾收集 java垃圾收集器种类_jvm_15

6 串行GC(Serial Old)/(Serial MSC)

java中垃圾收集 java垃圾收集器种类_垃圾收集_16

如何选择垃圾收集器

java中垃圾收集 java垃圾收集器种类_垃圾收集器_17


java中垃圾收集 java垃圾收集器种类_CMS_18

7 G1收集器

  • G1收集器是一款面向服务端应用的垃圾收集器。应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求。
  • 它还具有以下特性:
  • java中垃圾收集 java垃圾收集器种类_java中垃圾收集_19

  • G1收集器的设计目标是取代CMS收集器。与CMS相比,优点如下:
  • java中垃圾收集 java垃圾收集器种类_java中垃圾收集_20

  • jdk9中将G1变成默认的垃圾收集器。

java中垃圾收集 java垃圾收集器种类_jvm_21

java中垃圾收集 java垃圾收集器种类_垃圾收集器_22

java中垃圾收集 java垃圾收集器种类_jvm_23

  • 后台维护一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的内存块。
  • G1参数配置
  • java中垃圾收集 java垃圾收集器种类_CMS_24