1、Serial(串行)收集器(新生代都采用复制算法)
    这是个单线程的收集器:即 当他工作的时候,会停掉虚拟机所有的线程!(Stop The World)
2、ParNew(并行)收集器(新生代都采用复制算法)
    这是Serial的升级版,允许多条GC线程同时回收,但是,依然要停掉所有的用户线程(Stop The World)
3、Parallel Scavenge收集器(新生代都采用复制算法):尽可能的减少用户程序的停顿时间
    这也是并行收集器,跟ParNew看上去一样,但多了个重要的性能:可控吞吐量
    吞吐量:运行用户代码时间/(运行用户代码时间+垃圾回收时间)
      -XX:MaxGCPauseMillis=m:m是一个大于0的毫秒数。即:收集器尽可能的保证内存回收花费的时间不超过设定值。
      -XX:GCTimeRatio=n:n是大于0小于100的整数。公式1/(1+n)为垃圾收集时间占总时间的百分比。即:如果n=9。那么1/(1+9)=10%。GC运行的时间占总时间的10%。
      -XX:+UseAdaptiveSizePolicy:这是一个开关参数,打开这个参数之后,就不需要手动指定新生代的大小(-Xmn),Eden和Survivor的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,自动调整这些参数,以配合停顿时间或者吞吐量。
4、Serial Old收集器
    是Serial的老年代收集器,老年代采用“标记-整理”算法。
5、Parallel Old 收集器 
    是Parallel Scavenge的老年代收集器,老年代采用“标记-整理”算法。
6、CMS 收集器 (Concurrent Mark Sweep)
     获取最短回收停顿时间为目的。
      整个过程:
            1.初始标记(CMS initial mark):stop the world,时间短。串行
            2.并发标记(CMS concurrent mark): 并发
            3.重新标记(CMS remark):stop the world ,时间比初始标记长,但也很短。并行
            4.并发清除(CMS concurrent sweep): 并发
 
        说明:    
             1、CMS默认启动的回收线程:(CPU数量+3)/ 4。可以计算,cup数量不合适的时候,会占很多的cup。
                2、浮动垃圾(Floating Garbage):CMS并发回收的同时,用户线程还在不断的产生垃圾,这部分垃圾只有在下次才会被回收。
                3、JDK1.5默认当老年代使用到了68%时触发。调整参数:-XX:CMSInitiatingOccupancyFraction=70。即:老年代占70%的时候触发垃圾回收。。JDK1.6已经提升到92%
                4、标记-清除  算法本身会有很多的内存碎片产生。所以有一下两个参数
                        -XX:+UseCMSCompactAtFullCollection   :开关参数,默认开启。在老年代内存不够时,或者零碎内存放不下大对象时,进行内存压缩。
                        -XX:CMSFullGCsBeforeCompaction=5: 设置当进行5次不压缩的GC后,跟着来一次压缩的GC。
7、G1 收集器 (Garbage-First)
        JDK7u4中开始应用,被赋予使命:替换CMS收集器。
         整个过程:
             1.初始标记(Initial marking):stop the world,时间短。串行
             2.并发标记(Concurrent marking): 并发
             3.最终标记(Final Marking):stop the world 。并行
             4.筛选回收(Live Data Counting and Evacuation):stop the world 。并行
        
        特点:
            1、并发与并行。
            2、分代收集(他可以不依赖分代)。
            3、空间整合:整体采用“标记-整理”,局部(Region之间)采用“复制算法”。
            4、可预测的停顿:能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾回收上的时间不得超过N毫秒。
        看起来没那么厉害,那他到底哪里好了?
        实现:
            1、“化整为零”,将整个堆区分为若干个Region(区域)。新生代和老年代不再物理隔离,而是各自由不同的Region组成。
            2、 价值大小:回收所获得的空间大小以及回收所需时间的经验值。在后台维护一个优先列表,每次根据允许的收集时间,有限回收加值大的Region。这种分区和优先级的模式,可以最大的保证在有限的时间内获取尽可能高的收集效率。
            3、Remembered Set:为了避免或者尽可能减少由于Region之间对象的引用而引起的整个堆的扫描(因为Region之间可以互相引用,导致扫描不可能只发生在单个Region)。G1中每个Region都有与之对应的Remembered Set,虚拟机发现程序在对Reference类型进行写操作时(Reference写操作:就是将对象的引用关系写入Reference中),会产生一个Write Barrier暂时中断写操作,检查Reference类型是否在不同的Region,如果是,便通过CardTable吧相关的引用信息写入到被引用对象所属的Region中的Remembered Set中,保证不对全内存扫描,也不会遗漏内存垃圾。

JVM·垃圾收集器与内存分配策略之垃圾收集器!的更多相关文章

  1. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  2. jvm系列 (二) ---垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...

  3. JVM性能优化系列-(2) 垃圾收集器与内存分配策略

    2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...

  4. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  5. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  6. 深入理解java虚拟机_第三章(上)----->垃圾收集器与内存分配策略

    1.  前言 这一版块内容比较多,分为两篇文章来做笔记.本文讲述上半部分垃圾收集部分;下一篇文章写内存分配部分. 概述 对象已死吗? 引用技术算法 可达性分析算法 再谈引用 两次标记 回收方法区 2. ...

  7. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

  8. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...

  9. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

随机推荐

  1. [译]C#7 Pattern Matching

    原文 public struct Square { public double Side { get; } public Square(double side) { Side = side; } } ...

  2. Redis Fun使用

    using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Configuration; using Sy ...

  3. pyqt5-顶层窗口特定操作-图标和标题和不透明度

    图标: setWindowIcon(QIcon("resource/header_icon.png"))     设置窗口图标 icon=QIcon(r'大象.png')      ...

  4. luogu P2470 [SCOI2007]压缩

    传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in ...

  5. Linux基础学习【规则与安装】

    一.主分区.扩展分区与逻辑分区的特性: 主分区与扩展分区最多可以有4个(硬盘的限制) 扩展分区最多只能有1个 逻辑分区是由扩展分区持续切割出来的分区 能够被格式化后作为数据访问的分区为主分区和逻辑分区 ...

  6. Simple Recurrent Unit,单循环单元

    SRU(Simple Recurrent Unit),单循环单元 src/nnet/nnet-recurrent.h 使用Tanh作为非线性单元 SRU不保留内部状态 训练时,每个训练序列以零向量开始 ...

  7. 使用flask_socketio实现客户端间即时通信

    前期没有来得及好好总结,现在复习总结一下: Socket.IO 背后主要的思想是你可以发送和接收想要的任何事件,携带你想要的任何数据.任何可以编码为 JSON 的对象都可以做到,并且也支持二进制数据. ...

  8. Got error 28 from storage engine 解决方法

    早上一来,jira点击任何页面都会报错,首先查看服务器的日志 然后服务器首先看了磁盘,果不其然,是根目录的磁盘满了, 然后就一层一层找占用最大的文件 命令: cd /usr du -sh * 找到了文 ...

  9. table 如何不越过父级div

    设置table 被限制在外围div的方法: 设置样式: table { table-layout: fixed; /*fiexed 列宽由表格宽度和列宽度设定. 默认.列宽度由单元格内容设定.*/ w ...

  10. 使用IDEA新建Web工程启动报404的错误

    新换了一个项目组被人吐槽配置文件都能写错,所以打算从头开始一步步搭建一个项目,包含ssm基础框架.mongodb工具类.redis工具类.jsf配置.log配置等 今天先来搭建一个web工程.工程搭建 ...