一、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. Removable Storage Devices文件夹删除方法

    Windows10的桌面上出现了名为“Removable Storage Devices”的文件夹删除方法 比较莫名奇妙,突然桌面上出现了名为“Removable Storage Devices”的文 ...

  2. PIXI FlappyBird详解(9)

    本文为了学习及使用pixi参考该文,使用pixi实现 这个实方式跟玉兔太空类似, 这里介绍下实现步骤 1.创建舞台及应用大小根据实际去定义 2.创建背景素材,可以采取纹理图集,在前边有提过或是看官网了 ...

  3. SpringBoot内嵌Tomcat开启APR模式(运行环境为Centos7)

    网上查到的一些springboot内嵌的tomcat开启apr的文章,好像使用的springboot版本较老,在SpringBoot 2.0.4.RELEASE中已经行不通了.自己整理了一下,供参考. ...

  4. Service启动流程

    Service启动流程从整个宏观上来看,它的模型如下 startService启动流程时序图 Activity中使用的startService方法是定义在Context的抽象类中,它的真正实现者是Co ...

  5. (转)基于keepalived搭建MySQL的高可用集群

    基于keepalived搭建MySQL的高可用集群  原文:http://www.cnblogs.com/ivictor/p/5522383.html MySQL的高可用方案一般有如下几种: keep ...

  6. js中的 == 与 === 、永远不要使用 ==

    前言: 很久没有复习基础了,所以导致做项目的时候被坑,咳咳,基础还是很重要的. === 是没有强制类型转换的,和其他大部分语言的 == 是一样的.而js中 == 是有类型转换的,这也是js饱受诟病的原 ...

  7. VMware Workstation pro14 虚拟机下安装CentOS6.5图文教程

    1 启动VMware的画面 2.点击 创建新的虚拟机 3 选择 典型(推荐) 4 选择 稍后安装操作系统 5 选择客户机操作系统类型 6 设置虚拟机名称 和 安装路径 7 指定磁盘容量 8 点击 自定 ...

  8. Linux 命令学习之ls

    ls(list) 功能说明: ls 命令是Linux中使用最频繁的命令,即list的缩写,默认情况下会罗列出当前文件下的所有文件.同时ls 也可以指定罗列某个文件下的文件.而且该命令可以查看文件的一些 ...

  9. Oracle 行列转换总结

    行列转换包括以下六种情况:*列转行*行转列*多列转换成字符串*多行转换成字符串*字符串转换成多列*字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的知识:a.掌 ...

  10. php将“\\”转换成“\”的例子

    str_replace('\\\\', '\\', $url);