一、Serial收集器
新生代收集器,在垃圾回收时,必须暂停其他所有的工作线程。即Stop-The-World。
评价:老而无用,食之无味,弃之可惜。

二、ParNew收集器
新生代收集器,serial多线程的版本。
ParNew收集器和serial在控制参数、收集算法、Stop The World、对象分配原则、回收策略都保持一致。
 
 

paramllel:并行,指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。
concurrent:并发,指用户线程与垃圾回收同时执行,(但不一定是并行的,可能会交替执行)用户程序仍在继续运行,而垃圾回收机程序运行在另一个CPU上。

三、Parallel Scavenge收集器
又叫“吞吐量优先”收集器
1.该收集器的关注点在于控制空的吞吐量。
2.吞吐量=运行用户代码时间/(运行用户代码时间+垃圾回收时间)
3.控制吞吐量参数:
1)最大垃圾收集停顿时间:-XX:MaxGCPauseMillis,大于0的毫秒数,GC停顿时间是以牺牲吞吐量和新生代空间来换取。
2) 直接设置吞吐量大小:-XX:GCTimeRatio,大于0且小于100的整数,也就是垃圾收集时间占总时间比率。
如果把此参数设置为19,那允许的最大GC时间就占总时间的5%(即1/(1+19)),默认值为99,就是允许最大1%(即1/(1+99))的垃圾收集时间。
3)-XX:+UseAdaptiveSizePolicy(GC自适应的调节策略GC Ergonomics):开关参数,当这个参数开大之后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数。
3.Parallel Scavenge 和ParNew的区别: 开启开关量,然后设置-Xmx、MaxgcPauseMillis和GCTimeRatio,其他具体参数由虚拟机自动调节。
四、Serial Old收集器
复制-标记算法
五、Parallel Old收集器
标记-整理算法,JDK1.6开始提供,
Parallel Scavenge 和Parallel Old 组合使用。

六、CMS 收集器
Concurrent Mark Sweep,并发低停顿收集器Concurrent Low Pause Collector
CMS是一款以获取最短回收停顿时间为目标的收集器。
1.收集过程:
1)初始标记CMS initial mark
标记一下GC Roots能直接关联到的对象,速度很快,但是还是会发下Stop The World。
2)并发标记CMS concurrent mark
并发标记阶段就是进行GC Roots Tracing过程中
3)重新标记 CMS concurrent sweep
未了修正并发标记期间,因为用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这 个阶段的停顿时间一般会比初试标记阶段稍微长一些,但是远比并发标记时间短。
4)并发清楚 CMS concurrent sweep

2. 3个明显的缺点:
1)CMS收集器对CPU资源非常敏感。
默认回收线程:(CPU县城苏+3)/4。当服务器CPU只有2核时,CMS收集器对应用程序可能产生很大的影响,运行速度可能降低50%。
“增量式并发收集器(Incremental Concurrent Mark Sweep/i-CMS)”的CMS收集器变种。让并发标记、清除时候GC线程、用户线程交替运行,尽量减少GC线程独占资源的时间。效果一般,已被废弃。
2)CMS无法处理浮动垃圾(Floating Gargage),可能出现Concurrent Mode Failure失败而导致另一次Full GC的产生。
浮动垃圾:CMS垃圾回收正在运行,用户的线程也在运行同时不断的产生垃圾,这一部分垃圾出现在标记过程之后,CMS无法在当次回收中处理掉它们,只要等待下一次GC再清楚,这部分垃圾成为浮动垃圾。
JDK1.6收集器的启动阈值是92%,即当老年代使用了92%后,CMS收集器会被激活。要是CMS运行期间预留的内存无法满足程序需要,就会出现Concurrent Mode Failure,此时虚拟机启动预备方案: 临时启用Serial Old收集器来重新进行老年代的垃圾回收,这样停顿时间较长。
如果来年代增长过快,可以适当调高参数:
-XX:CMSInitiatingOccupancyFraction调高处罚百分比,当然如果这个参数比例太高,则很容易出现大量的Concurrent Mode Failure,性能反而降低。
3)出现大量的空间碎片。当产生大量碎片,会出现在老年代有很大的空间但是仍然无法满足有足够的连续的空间来分配当前的对象,不得不提前触发一次Full GC。
七、G1收集器
G1具备的特点:
1)并行与并发。
2)分代收集。
3)空间整合。G1从整体看是基于标记-整理算法实现的收集器,从局部(两个Region之间)上来看是基于复制算法实现。
4)可预测的停顿。G1简历可预测的停留时间模型,能够让使用者明确指定在一个程度为M毫秒的时间判断内,消耗在垃圾回收集上的时间不超过N毫秒,这几乎是实时java的垃圾回收器的特征。
将堆分为多个Region,同时兼容老年代和新生代的概念,不是物理隔离而是Region的集合(不连续)
G1收集器运作步骤:
初始标记
并发标记
最终标记
筛选回收

第三篇:jvm之垃圾回收器的更多相关文章

  1. 【JVM】垃圾回收器总结(2)——七种垃圾回收器类型

    七种垃圾回收器类型 GC的约定参数 DefNew——Default New Generation Tenured——Serial Old ParNew——Parallel New Generation ...

  2. 深入理解JVM一垃圾回收器

    上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...

  3. 深入探究JVM之垃圾回收器

    @ 目录 前言 正文 一.垃圾收集算法 标记-复制 标记-清除 标记-整理 分代回收 二.常用的垃圾回收器 Serial/SerialOld ParNew Parallel Scavenge/Para ...

  4. jvm学习-垃圾回收器(四)

    说明 各种垃圾回收算法都有各自的优缺点.jvm也并没有只采用一种垃圾算法.并提供几种组合供我根据场景进行选择. jvm内存结构 Person p=new Person(); 1.程序里面创建一个对象会 ...

  5. JVM七大垃圾回收器下篇G1(Garbage First)

    G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC?  原因就在于应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保 ...

  6. JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1

    GC逻辑分类 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本. 从不同角度分析垃圾收 ...

  7. 面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

    今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有人点赞的这些年,我都是咬着牙过来的. Java中的垃圾回收器几乎是面试中的必考点,无论是面试初级,中级还是高级,总免不了要问一问垃圾回收器的 ...

  8. JVM(3) 垃圾回收器与内存分配策略

    文章内容摘自:深入理解java虚拟机 第三章   对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  9. jvm——CMS 垃圾回收器(未完)

    https://matt33.com/2018/07/28/jvm-cms/ 阶段1:Initial Mark stop-the-wolrd 标记那些直接被 GC root 引用或者被年轻代存活对象所 ...

随机推荐

  1. python四则运算2.0

    github项目地址: https://github.com/kongkalong/python PSP 预估耗时(分钟) Planning .Estimate 48*60 Development . ...

  2. CDH集群安装配置(七)--CDH组件的安装和配置

    1. Clouder Manger页面的配置 访问主节点IP:(cdh1)192.168.80.81:7180 默认用户名和密码:admin,admin 选择一个版本 选择集群的服务器(agent), ...

  3. Three.js 前言

    -----------------------------------本文非技术文章,着急开发的小伙伴请绕道----------------------------------------- 最近公司 ...

  4. CSAPP阅读笔记-汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163

    1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...

  5. fish shell version

    如果你使用 fish shell, 想要自己定义变量,或者函数,或者alias, 不要使用      version     这个名字, 因为,version 这个名字 被 fish 本身占了.... ...

  6. Python基础(3) - 数据类型:1数字类型

    Python数据类型 数据类型 是否容器 是否可变 存储方式 数字 否 否 直接 字符串 否 否 直接 列表 是 是 顺序 元组 是 否 顺序 字典 是 是 映射 数字类型 整  型:1,234,0, ...

  7. [转]Using OData from ASP.NET

    本文转自:http://www.drdobbs.com/windows/using-odata-from-aspnet/240168672 By Gastón Hillar, July 01, 201 ...

  8. [转]浅谈 .NET Framework 与 .NET Core 的区别与联系

    本文转自:http://www.cnblogs.com/huchaoheng/p/6295688.html 2017到了,咱们学点啥啊,要想知道学点啥,先弄清.NET Framework 与 .NET ...

  9. .Net程序员玩转Android系列之二~Android Framework概要(1)

    从windows操作系统说起 人们总是喜欢从将陌生的事物和自己所了解的东西关联起来,以加深对未知事物的了解,这一讲我们从windows操作系统说起,逐步引领带大家走入android的世界.写任何程序都 ...

  10. WebAPI搭建(一)如何在Webforms 下 搭建WebAPI

    公司的很多项目前期一直是用的WebForms.但是因为业务的发展,公司要在原有的项目上接入移动端,webservice有点老旧了,现在比较流行RESTFul,于是乎就想到了WebAPI. 一.如果是新 ...