一、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. django 创建QueryDict类型报错

    报错信息:django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are ...

  2. 使用app-inspector查看元素,无法连接到手机,提示错误{ Error: Command failed ……forward tcp:9001 tcp:9001错误解决

    在学习使用app-inspector查看元素时,碰到一个问题.在cmd窗口执行命令app-inspector --port 5678 -u 85EABNFSU53R --verbose  ,连接不到手 ...

  3. 分分钟钟学会Python - 数据类型(set)

    目录 今日内容 具体内容 1.集合含义 2.独有方法 3.公共方法 4.特殊情况 5.总结 @ 今日内容 集合(set) 具体内容 1.集合含义 一个无序的不重复元素序列. 可以使用大括号 { } 或 ...

  4. js Object.keys 用法

    Object.keys()   可以将对象里的所以的键取出来放到一个数组中 1.传入对象, 返回 包含对象可枚举属性和方法的数组 var obj = {'a': 'Beijing', 'b': 'Ha ...

  5. linux新增特性timerfd

    https://blog.csdn.net/shreck66/article/details/49745149

  6. TomCat端口被占用问题

    TomCat在使用时,有时会爆出端口被占用的问题 解决方法: 1.快捷键win+R,输入cmd,点击回车后再输入netstat -ano|findstr 8005 注:什么端口被占用就输入什么端口号 ...

  7. Part 1: Setting up ARM GNU tool chain

    ARM Build Tools GNU Tools for ARM Embedded Processors. GNU Make for Windows. GNU Tools for ARM Embed ...

  8. selenium+python(数据驱动测试)

    自动化领域的两种驱动,对象驱动与数据驱动 数据驱动:测试数据的改变引起执行结果的改变 叫 数据驱动 关键字驱动:测试对象名字的改变起引起测试结果的改变 叫 关键字驱动 1 .读取文件参数化   以百度 ...

  9. 【ExtJS】一个简单的TreePanel

    在ExtJS中,构造一个树形结构变得很简单. 需要用到的: Ext.tree.Panel TreePanel提供树形结构的UI表示的树状结构数据. 一个TreePanel必须绑定一个Ext.data. ...

  10. C#中加粗label的字体

    1. 在C#的代码中想直接加粗label控件的字体, label1.Font.Bold = true;//发现系统会提示Font.Bold是只读属性 如果必须要加粗字体呢,方法如下: 2. 使用Fon ...