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. python中的*和**的用途

    def function_with_one_star(*t):    print(t, type(t)) def function_with_two_stars(**d)    print(d, ty ...

  2. C++中extern(转)

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  3. PhpStorm+xdebug+postman调试

    PhpStorm+xdebug+postman调试 写PHP时,一直用postman做测试,最近发现在测试过程中可以用xdebug来断点调试,比原来手动打exit或者die来断点效率高多了. 下面记录 ...

  4. jq的css方法

    读属性: $(selector).css(name) 设置属性: 法一: $(selector).css(name,value) 法二: $(selector).css(name,function(i ...

  5. 【tmos】mvn package相关知识点(待补充...)

    SpringBoot项目打包跳过测试 <build> <plugins> <plugin> <groupId>org.springframework.b ...

  6. (6)Java数据结构-- 转:JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析  http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...

  7. BootstrapValidator 解决多属性被同时校验问题

    问题描述:在使用bootstrapValidator插件校验表单属性,当表单属性过多需要每行并列多个属性 ,会出现校验第一个属性,发现整行被校验的效果 ,这不是我们工作想要的效果.如图: 问题分析:因 ...

  8. OGG初始加载过程概述

    您可以使用Oracle GoldenGate来: 执行独立的批量加载以填充数据库表以进行迁移或其他用途. 将数据作为初始同步运行的一部分加载到数据库表中,以准备与Oracle GoldenGate进行 ...

  9. [转载]linux内存映射mmap原理分析【转】

    转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...

  10. python实战===教你用微信每天给女朋友说晚安【转】

    转自:https://www.cnblogs.com/botoo/p/8622379.html#4081184 但凡一件事,稍微有些重复.我就考虑怎么样用程序来实现它. 这里给各位程序员朋友分享如何每 ...