JVM之几种垃圾收集器简单介绍

本文中的垃圾收集器研究背景为:HotSpot+JDK1.7

一、垃圾收集器概述

如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。

JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用

二、各个垃圾收集器说明

1、Serial(年轻代)

  1. 年轻代收集器,可以和Serial Old、CMS组合使用
  2. 采用复制算法
  3. 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止
  4. client模式年轻代默认算法
  5. GC日志关键字:DefNew(Default New Generation)
  6. 图示(Serial+Serial Old)

2、ParNew(年轻代)

  1. 新生代收集器,可以和Serial Old、CMS组合使用
  2. 采用复制算法
  3. 使用多线程进行垃圾回收,回收时会导致Stop The World,其它策略和Serial一样
  4. server模式年轻代默认算法
  5. 使用-XX:ParallelGCthreads参数来限制垃圾回收的线程数
  6. GC日志关键字:ParNew(Parallel New Generation)
  7. 图示(ParNew + Serail Old)

3、Paralle Scavenge(年轻代)

  1. 新生代收集器,可以和Serial Old、Parallel组合使用,不能和CMS组合使用
  2. 采用复制算法
  3. 使用多线程进行垃圾回收,回收时会导致Stop The World
  4. 关注系统吞吐量
    1. -XX:MaxGCPauseMillis:设置大于0的毫秒数,收集器尽可能在该时间内完成垃圾回收
    2. -XX:GCTimeRatio:大于0小于100的整数,即垃圾回收时间占总时间的比率,设置越小则希望垃圾回收所占时间越小,CPU能花更多的时间进行系统操作,提高吞吐量
    3. -XX:UseAdaptiveSizePolicy:参数开关,启动后系统动态自适应调节各参数,如-Xmn、-XX:SurvivorRatio等参数,这是和ParNew收集器重要的区别
  5. GC日志关键字:PSYoungGen

4、Serial Old(年老代)

  1. 年老代收集器,可以和所有的年轻代收集器组合使用(Serial收集器的年老代版本)
  2. 采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理
  3. 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止
  4. GC日志关键字:Tenured
  5. 图示(Serial+Serial Old)


     

5、Parallel Old(年老代)

  1. 年老代收集器,只能和Parallel Scavenge组合使用(Parallel Scavenge收集器的年老代版本)
  2. 采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理
  3. 关注吞吐量的系统可以将Parallel Scavenge+Parallel Old组合使用
  4. GC日志关键字:ParOldGen
  5. 图示(Parallel Scavenge+Parallel Old)


     

6、CMS(Concurrent Mark Sweep年老代)

  1. 年老代收集器,可以和Serial、ParNew组合使用
  2. 采用 ”标记-清除“算法,可以通过设置参数在垃圾回收时进行内存碎片的整理
    1、UserCMSCompactAtFullCollection:默认开启,FullGC时进行内存碎片整理,整理时用户进程需停止,即发生Stop The World
    2、CMSFullGCsBeforeCompaction:设置执行多少次不压缩的Full GC后,执行一个带压缩的(默认为0,表示每次进入Full GC时都进行碎片整理)
  3. CMS是并发算法,表示垃圾回收和用户进行同时进行,但是不是所有阶段都同时进行,在初始标记、重新标记阶段还是需要Stop the World。CMS垃圾回收分这四个阶段
    1、初始标记(CMS Initial mark)    Stop the World   仅仅标记一下GC Roots能直接关联到的对象,速度快
    2、并发标记(CMS concurrent mark) 进行GC Roots Tracing,时间长,不发生用户进程停顿
    3、重新标记(CMS remark)          Stop the World   修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象的标记记录,停顿时间较长,但远比并发标记时间短
    4、并发清除(CMS concurrent sweep) 清除的同时用户进程会导致新的垃圾,时间长,不发生用户进程停顿
  4. 适合于对响应时间要求高的系统
  5. GC日志关键字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等
  6. 缺点
    1、对CPU资源非常敏感
    2、CMS收集器无法处理浮动垃圾,即清除时用户进程同时产生的垃圾,只能等到下次GC时回收
    3、因为是使用“标记-清除”算法,所以会产生大量碎片
  7. 图示

7、G1

  1. G1收集器由于没有使用过,所以从网上找了一些教程供大家了解
    1. 并行与并发
    2. 分代收集
    3. 空间整合
    4. 可预测的停顿
  2. http://blog.csdn.net/renfufei/article/details/41897113
  3. http://blog.csdn.net/woshiqjs/article/details/7290513

三、各垃圾收集参数设置

原文地址:https://www.cnblogs.com/tiancai/p/9284116.html

时间: 2024-10-28 23:22:10

JVM之几种垃圾收集器简单介绍的相关文章

JVM(HotSpot)7种垃圾收集器

7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器->CMS->G1,用户线程停顿时间不断缩短,但仍然无法完全消除. 1.Serial收集器(串行收集器) Serial收集器是最基本.发展历史最悠久的收集器,曾是(JDK1.3.1之前)虚拟机新生代收集的唯一选择. Serial收集器是一个单线程的收集器.“单线程”的意义不仅仅是它只会使用一个CPU或一条收集器线程去完成垃圾收集工作,更

【深入理解JVM】:HotSpot垃圾收集器

相关概念 并发和并行 这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上. Minor GC 和 Full GC 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以M

HotSpot的7种垃圾收集器组合

HotSpot共有7种垃圾收集器,3个新生代垃圾收集器,3个老年代垃圾收集器,以及G1,一共构成7种可供选择的垃圾收集器组合. 新生代与老年代垃圾收集器之间形成6种组合,每个新生代垃圾收集器都对应2种组合. Serial Old(MSC)可以与所有新生代收集器进行组合,共3种组合JVM仅指定新生代垃圾收集器的情况下,默认老年代采用Serial Old垃圾收集器(带压缩):-XX:+UseSerialGCSerial (DefNew) + Serial Old(Serial Mark Sweep

Dotfuscator VS中自带的混淆器和压缩器简单介绍以及用法

Dotfuscator是VS里面一个自带的.NET混淆器和压缩器,它可以帮助您防止您的应用程序被反编译.同时,它还可以使得您的应用程序更加小巧以及高效. 闲话不多少了,下面介绍它的基础用法,从此让你编译后的程序变得更贱更神秘,大牛自行绕过啦,小虾可以看看学一下... 1:安装 下载并安装混淆器,这里有一个4.9破解版的(该软件来源于网络) 点击下载 提取码:a435 2:安装完毕后打开,如下图 3:选择你要加密混淆的DLL或EXE文件,我这里就直接用一个exe文件举例啦,如下图 \ 4:下边就开

详解 JVM Garbage First(G1) 垃圾收集器

前言    Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估.本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比:然后通过G1的内存模型.G1的活动周期,对G1的工作机制进行了介绍:同时还在介绍过程中,描述了可能需要引起注意的优化点.笔者希望通过本文,让有一定JVM基础的读者能尽快掌握G1的知识点. 第一章 概述 G1(Garb

JVM中的G1垃圾收集器

G1 垃圾收集器是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项: 作为JVM GC算法的一次重大升级.JDK7u后G1已相对稳定.且未来计划替代CMS.所以有必要深入了解下:不同于其他的分代回收算法.G1将堆空间划分成了互相独立的区块.每块区域既有可能属于O区.也有可能是Y区,且每类区域空间可以是不连续的(对比CMS的O区和Y区都必须是连续的).这种将O区划分成多块的理念源于:当并发后台线程寻找可回收的对象时.有些区块包含可回收的对象要比其他区块多很多.虽然在清理这

设计模式的学习(一)-软件设计模式的概念与意义以及23种设计模式的简单介绍

有关软件设计模式的定义有很多,有些是从模式的作用出发,也写是根据模式的特点,本文根据大多数教材定义,从以下两个方面来说明. 软件模式的概念.软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用,多数人知晓,经过分类编目.代码设计经验的总结.它描述了在软件设计过程中的一些不断重复发生的问题,以及对该问题的解决方案.也就是说,它是解决特定问题的一系列套路,是前辈们代码设计经验的总结,具有一定的普遍性,可以反复使用.目的是为了提高代码的可重用性,代码的可读性和

JVM常见的七种垃圾收集器的简单比较

1.Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器. 2.Serial Old是Serial收集器的老年代版本,同样是单线程收集器,使用标记整理算法. 3.ParNew收集器是Serial收集器的多线程版本,许多运行在Server模式下的虚拟机中首选的新生代收集器,除Serial外,只有它能与CMS收集器配合工作. 4.Parallel Scavenge收集器也是新

Java虚拟机七种垃圾收集器比较

1.Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器. 2.Serial Old是Serial收集器的老年代版本,同样是单线程收集器,使用标记整理算法. 3.ParNew收集器是Serial收集器的多线程版本,许多运行在Server模式下的虚拟机中首选的新生代收集器,除Serial外,只有它能与CMS收集器配合工作. 4.Parallel Scavenge收集器也是新