JVM_七种垃圾收集器介绍

 
本文中的垃圾收集器研究背景为:HotSpot+JDK7
一、垃圾收集器概述
如上图所示,垃圾回收算法一共有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
 
 
三、各垃圾收集参数设置
 

  

jvm七种垃圾收集器的更多相关文章

  1. JVM_七种垃圾收集器介绍

    本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代和年 ...

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

    1.Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器. 2.Seria ...

  3. 【JVM进阶之路】七:垃圾收集器盘点

    在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法.接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的 ...

  4. JVM内存管理---垃圾收集器

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...

  5. JVM的7种垃圾收集器:主要特点 应用场景 设置参数 基本运行原理

    原文地址:https://blog.csdn.net/tjiyu/article/details/53983650 下面先来了解HotSpot虚拟机中的7种垃圾收集器:Serial.ParNew.Pa ...

  6. JVM的分区+查看GC对象是否存活+3种GC算法+7种垃圾收集器+如何减少GC次数

    一.JVM的分区:   1.程序计数器(私有) 程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器. 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变计数器的值来选择下 ...

  7. JVM(HotSpot)7种垃圾收集器

    JVM(HotSpot)7种垃圾收集器 7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器 ...

  8. Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  9. Java虚拟机垃圾回收(三) 7种垃圾收集器

    Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java ...

随机推荐

  1. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  2. JS实现Observable观察者模式

    欢迎讨论与交流 : ) 注 代码参考自——汇智网 RxJS教程 前言 Observable观察者模式令小白笔者眼前一亮.数据生产者(observable)负责生产新鲜的数据,同时在生产完毕后'通知“消 ...

  3. 【UE】关于UE的一个真实案例

    看到下面这个页面,你心里是怎么想的?我看到后,我心里会有疑问:咦,是不是程序错了?如果是程序错了,我应该怎么补偿呢?怎么没有刷新按钮? 针对以前几点问题,做以下几点改进: 1.在没有数据时,增加提示, ...

  4. Spring源码分析——资源访问利器Resource之接口和抽象类分析

    从今天开始,一步步走上源码分析的路.刚开始肯定要从简单着手.我们先从Java发展史上最强大的框架——Spring...旗下的资源抽象接口Resource开始吧. 我看了好多分析Spring源码的,每每 ...

  5. Linux ubuntu安装

    http://www.ubuntu.org.cn/download/alternative-downloads 下载地址: http://releases.ubuntu.com/ 国内镜像: http ...

  6. 【51Nod 1616】【算法马拉松 19B】最小集合

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...

  7. 理解 HTTPS 的工作原理

    目标读者:理解HTTP协议,对称和非对称加密,想要了解HTTPS协议的工作原理. 读完本文,你能明白 什么是HTTPS,TLS(SSL),TLS和HTTPS是什么关系? 什么是证书和数字签名,它们是如 ...

  8. ETL基础1(概念)

    抽取(Extract): 一般抽取过程需要连接到不同的数据源,以便为随后的步骤提供数据.这一部分看上去简单而琐碎,实际上它是 ETL 解决方案的成功实施的一个主要障碍. 转换(Transform): ...

  9. qthread 使用 signal 方法通信

    因为之间尝试过的 signal 机制,都是在 emit singnal_my() 的地方,直接调用了 slot 函数:相当于,slot 只是一个回调函数. 所以,在这里有点困惑,如果是要顺序执行完 s ...

  10. RabbitMQ Lazy Queue 延迟加载

    Lazy Queue 在著名的单例设计模式中就有懒汉式的实现方式,也就是只有在你需要的时候我才去加载. 这让博主想到了以前上学的时候,每到了假期的假期作业,在假期的时候是从来不做的.只有在快开学老师要 ...