一、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. 1.使用frp穿透内网

    1.前因后果 1.1弃用ngrok 为节约服务器成本,花了500多块买了一个华为云得1G 1核心 5M得云服务器.然后用ngrok来穿透内网.一直用得还  但是今天在弄nginx得时候发现 ngrok ...

  2. $bzoj1014-JSOI2008$ 火星人$prefix$ $splay$ $hash$

    题面描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\),我们将这个字符串的各个字符予以标号: 序号 1 2 3 4 5 6 7 8 ...

  3. SPRING中的线程池ThreadPoolTaskExecutor(转)

    转自:https://blog.csdn.net/zhanglongfei_test/article/details/51888433 一.初始化 1,直接调用 ThreadPoolTaskExecu ...

  4. JAVA学习2:Eclipse集成Maven

    我的环境: Eclipse:eclipse-jee-juno-SR2-win32 Maven:Maven3.0.5 1.Help->Eclipse Marketplace 2.选中要安装的插件, ...

  5. Oracle 数据表的管理

    1.创建表的的表名规则 a.必须已字母开头 b.长度不能超过30 c.不能是Oracle的保留字 d.只能使用如下字符:A-Z.a-z.1-9.#,$等 2.Oracle基本数据类型 2.1 字符型数 ...

  6. Oracle 客户端安装

    Oracle 客户端的安装方式一种有两种: 1.Oracle标准客户端   点击下载 这是Oracle提供的标准版11r2的客户端 2.Oracle Database Instant Client(即 ...

  7. centos 7编译安装apache

    1.安装工具和依赖包 yum install unzipyum -y install gcc gcc-c++ 2.创建软件安装目录mkdir /usr/local/{apr,apr-util,apr- ...

  8. 使用js命名空间进行模块式开发

    在java中,为了防止命名冲突和模块式开发,会有个一个import 关键字来进行导包. 在js中为了达到同样的效果,我们也通过给其自定义一个“包”的概念. 直接上代码: 首先有个LC.js文件: // ...

  9. 【百度之星2014~复赛 解题报告~正解】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  10. PHP中判断字符串是否包含某个字符时,建议使用正则表达式preg_match()

    判断字符串中是否包含 某个字符时,在java中时直接使用 indexOf()来判断的 在php中好像也要对应的,strpos(),stripos() 不过每次我用的都很不爽,老是出现各种各样的小问题, ...