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
三、各垃圾收集参数设置

转载于:https://www.cnblogs.com/lushilin/p/6140507.html

jvm七种垃圾收集器相关推荐

  1. 垃圾收集器回收种类 以及七种垃圾收集器

    垃圾收集器回收种类 垃圾收集器是垃圾回收算法的具体实现 串行垃圾回收器(Serial) 它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停用户线程 (并行垃圾回收器)Parallel 多个垃圾收集 ...

  2. Java 的七种垃圾收集器

    了解 Java 中的内存管理. 用 C 或 C++ 这样的编程语言写一个应用时,需要编写代码来销毁内存中不再需要的对象.当应用程序扩展得越来越复杂时,未使用对象被忽略释放的可能性就越大.这会导致内存泄 ...

  3. JVM学习----七种垃圾收集器(GC)

    文章目录 GC垃圾收集器 七种经典的垃圾回收器 查看默认垃圾收集器 新生代 Serial垃圾收集器(单线程. 复制算法) ParNew 垃圾收集器 (Serial的多线程版本. 复制算法) Paral ...

  4. 七种垃圾收集器和垃圾回收、分代收集、GCROOTS相关概念、GC如何判断一个对象可以被回收

    文章目录 垃圾收集器概述 垃圾回收算法 1)标记-清除算法(Mark-Sweep)(DVM 使用的算法) 2)复制算法(Copying) 3)标记-整理算法(Mark-Compact) 4)分代收集( ...

  5. Java——七种垃圾收集器+JDK11最新ZGC

    JDK1.8之前的堆内存示意图: 从上图可以看出堆内存的分为新生代.老年代和永久代.新生代又被进一步分为:Eden 区+Survior1 区+Survior2 区.值得注意的是,在 JDK 1.8中移 ...

  6. jvm 9种垃圾收集器

    如上图,一共有7种作用于不同分代的垃圾收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用,垃圾收集器所处区域表示它是属于新生代收集器还是老年代收集器: 新生代收集器:Serial.ParNew ...

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

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

  8. JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点

    47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...

  9. JVM的7种垃圾收集器

    原文地址:Java虚拟机垃圾回收(三) 7种垃圾收集器 Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中 ...

最新文章

  1. 维护表读写的权限对象
  2. mybatis 大于小于转义_10 HTML5特性、转义字符和注释
  3. C语言经典例82-八进制转换为十进制
  4. 设置elf文件链接库的路径
  5. 数据中心怎么关机?光有UPS还不够
  6. 2017第35周日乱记
  7. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
  8. python模糊图像清晰化_视频模糊图像处理
  9. Java 中接口和抽象类竟然有 7 点不同?
  10. 51与PC通信协议设计及实现(三):51部分模块化分工及设计
  11. 政策解读:《智能硬件产业创新发展专项行动(2016-2018年)》(下)
  12. postman如何模拟Map参数请求呢?
  13. django解决页面跳转问题
  14. 如何在Git中合并特定的提交
  15. Mac电脑设置鼠标主按钮的方法?
  16. 201906017学习小程序
  17. 嵌入式状态机编程-QP状态机框架与常见状态机方法
  18. Python 第六章 面向对象编程(MD模式)
  19. C# Transaction 事务
  20. 家用无线路由器哪个品牌好?程序员分享值得推荐的无线路由器

热门文章

  1. iOS编码:如何创建gbk编码
  2. 怎样将无线路由做成无线AP
  3. oracle 分区表的建立方法
  4. 走进Java 7模块系统
  5. 同步SQL Server 2000 数据库
  6. 如何使用Python创建,读取,更新和搜索Excel文件
  7. 学生教育云平台登录入口_湖南省教育云平台登录入口
  8. JAVA猴子选大王问题
  9. 通用软件测试的6个角度
  10. Python文件操作:finally子句的使用