一、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. IE8 placeholder不支持的兼容性处理

    引入 <script type="text/javascript" src="<%=path%>/common/js/jquery/jquery.min ...

  2. DP Intro - poj 1947 Rebuilding Roads

    算法: dp[i][j]表示以i为根的子树要变成有j个节点的状态需要减掉的边数. 考虑状态转移的时候不考虑i的父亲节点,就当不存在.最后统计最少减去边数的 时候+1. 考虑一个节点时,有两种选择,要么 ...

  3. mojing SDK根据坐标进行移动

    using UnityEngine; using UnityEngine.UI; using System.Collections; public class transforms : MonoBeh ...

  4. js中的new操作符与Object.create()的作用与区别

    js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...

  5. Go语言小试牛刀---几个简单的例子

    整理资料,发现之前手写的Go语言资料,现在贴过来. 第一个:Channel的使用,创建一个随机数 package main import "fmt" import "ru ...

  6. 基于CommonKADS方法论实现知识库系统

    说明:本文是Knowledge-based systems with thecommonKADS method文章的翻译. 一.知识库系统的背景 1. 什么是知识库系统(KBS) 知识库系统是人工智能 ...

  7. MyBatis整合Spring详细教程

    1整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代理 ...

  8. Linux下MySQL出现乱码的解决方法

    开发环境 cent os 6.5 mysql springboot duird 故障描述 本地开发环境没有任何问题,上传到服务器后发现提交的表单内容只要是中文直接变成 ??? 解决方式 错误尝试: 一 ...

  9. Druid SQL 解析器概览

    概览 Druid 的官方 wiki 对 SQL 解析器部分的讲解内容并不多,但虽然不多,也有利于完全没接触过 Druid 的人对 SQL 解析器有个初步的印象. 说到解析器,脑海里便很容易浮现 par ...

  10. 使用idea开发工具,nginx服务部署Extjs6,SpringBoot项目到服务器

    编译ExtJs文件 1.输入命令 2.开始编译 3.找到编译后的文件 E:\idea_project\BaiSheng_Model\fin-ui\build\production\Admin 4.将文 ...