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. java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap-----commons-ctions版本问题

    今天用到了一系列的第三方jar包,一环扣一环, 记住一个: 倘若你所导入的第三方jar包中的类一直显示未找到,那就是你的路径出问题了, /WEB-INF/lib目录下才是放第三方jar包位置, 但是今 ...

  2. 【51nod 1288】汽油补给

    Description 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的汽油,油箱的容量是T.给出每个城市 ...

  3. Frameset 框架

      <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.c ...

  4. js去掉某一属性

    将某一属性赋值为空就行了. 例如: document.getElementById('second').style.color = '';

  5. mybatis的两个核心对象SqlSessionFactory和SqlSession对象

    mybatis的两个核心对象SqlSessionFactory和SqlSession对象 参见:https://www.cnblogs.com/wxdestiny/p/9743686.html

  6. linux如何查看端口号被哪个进程占用

    1.lsof -i:端口号 lsof(list open files) 2.netstat -tunlp |grep 端口号 t:tcp u:udp n:拒绝显示别名 l:仅显示listen的服务状态 ...

  7. java基础_0204:运算符

    掌握Java中标识符的定义: 掌握Java中数据类型的划分以及基本数据类型的使用原则: 掌握Java运算符的使用: 掌握Java分支结构.循环结构.循环控制语法的使用: 掌握方法的定义结构以及方法重载 ...

  8. GDI+学习---2.GDI+编程模式及组成类

    在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(paramet ...

  9. Mybatis--课程中循序渐进的体会 《黑马程序员_Springmvc+Mybatis由浅入深全套视频教程video》

    mybatis 刚开始是用最原始的方法开发了一个入门程序,(没有dao) 1.将数据源配置在SqlMapConfig.xml 2.写一个po类 和映射文件User.xml(中的namespace=“名 ...

  10. 人人项目renren-security\git\renren-security的目录下的文件列表

    \.git\config; \.git\FETCH_HEAD; \.git\HEAD; \.git\index; \.git\logs\HEAD; \.git\logs\refs\heads\mast ...