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. angularjs路由path方式实现原理探究

    angularjs路由 https://angular.io/guide/router 通过URL解释, 来定位客户端生成的浏览器端视图. 你可绑定路由到页面的链接上, 当用户点击链接, 可以浏览到相 ...

  2. url 组成部分

    NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以 ...

  3. I/O 流

    输入流的几个常用方法: 1,复制一个文件; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...

  4. 6-12mysql库的操作

    1,mysql库的各种分类: nformation_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等. performance_sch ...

  5. windows平台下利用Nginx做负载均衡

    1.下载nginx(http://nginx.org/en/download.html)安装包,解压,并使用cmd命令转到nginx.exe所在的目录 2.执行cmd命令start nginx启动ng ...

  6. spring-core 中 asm 包的作用

    asm包中主要有以下这些类 其中, AnnotationVisitor类:是一个抽象类,定义在解析注解时会触发的事件,如解析到一个基本值类型的注解.enum值类型的注解.Array值类型的注解.注解值 ...

  7. git 配置 BeyondCompare

    安装 Beyond Compare 4 配置 git git config --global merge.tool bc3 git config --global mergetool.bc3.path ...

  8. hydra 使用总结

    参考链接: http://blog.csdn.net/MarshalEagle/article/details/51896083 https://www.waitalone.cn/hydra-v8-w ...

  9. MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)

    create table 表名 ( 列名1 列属性, 列名2 列属性 ... ... 列名n 列属性 )engine myisam charset utf8; (增加表的一列) (一)在表的最末列增加 ...

  10. 通用redis命令

    Redis五种数据类型,String,hash,list,set,有序set keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys. 通配符: *表示任意0 ...