根据《深入理解java虚拟机》这本书总结

  前面说到了垃圾标记方法、垃圾收集算法、这篇主要总结一下垃圾收集的具体实现:垃圾收集器

  一、七种常见的垃圾收集器:

    根据所在老年代还是年轻代列出:

    年轻代:Serial、parNew、Parallel Scavenge

    老年代:CMS(Cocurrent Mark Sweep)、Serial Old、Parallel Old

    年轻代+老年代:G1

  二、垃圾收集器具体特点

   1、Serial

      年轻代单线程收集器,没有线程交互的开销,可以达到单线程最高效率回收。

      采用复制算法实现、回收时需要暂停用户所有线程(stop the world)。

      一般适用于client模式下的年轻代收集,因为对象存活率比较低,并且client内存分配比较小,虽然停顿,但是几十毫秒是可以接受的。

      可以与老年代的:CMS、Serial Old配合使用

   2、Serial Old

      跟Serial一样,老年代的单线程收集器

      采用标记-整理算法实现,回收时需要暂时所有用户线程

      一般适用于client模式下的老年代的收集。

      可以与年轻代的:Serial、parNew、Parallel Scavenge配合使用      

     3、parNew

      Serial升级版,年轻代多线程收集器,可以并行收集(并行:多线程工作。并发:用户线程和手机线程同时工作)。

      采用复制算法,单核存在线程交互开销,在多核机器下效果比较好,回收时需要暂停用户所有线程(stop the world)。。

      可以与老年代的:CMS、Serial Old配合使用

   4、Parallell Scavenge

      年轻代的多线程并行收集器,与其他收集器关注点不同,主要关注吞吐量(运行用户代码时间/jvm总运行时间)

      采用复制算法,回收时需要暂停用户所有线程(stop the world)。。

      不需要手动指定年轻代的各区域大小等,可以动态设定参数,虚拟机会根据当前系统,动态调整最适合的垃圾回收停顿时间,达到需要的吞吐量。

      可以与老年代的:Serial Old、Parallel Old配合使用

   5、Paraller Old

      老年代多线程并行收集器,关注点也是吞吐量,同Parallell Scavenge

      采用标记整理算法,回收时需要暂停用户所有线程(stop the world)

      可以与新生代的:Parallell Scavenge配合使用

   6、CMS

      老年代的多线程并发并行收集器,以获取最短回收停顿时间为目标,常用语互联网B/S架构

      采用标记清除算法,过程为:初始标记(stop the world)-并发标记-重新标记(stop the world)-并发清除

     缺点:

      1、对cpu比较敏感,虽然并发清除期间不暂停用户线程,但是清除会占用一部分cpu资源,导致响应比较慢

      2、咋并发清除阶段产生的浮动垃圾,无法处理

      3、标记-清除,会产生空间碎片。长时间后会导致fullgc。

   7、G1收集器

      1、年轻代和老年代通用的收集器,并发并行收集器,但是现在生产环境还未大量使用

      2、G1与cms不一样,使用标记-整理算法,没有空间碎片。

      3、G1可以控制一次垃圾回收的停顿时间:其余的收集器,要么是针对年轻代、要么是针对老年代,G1的策略不同,将堆的内存布局分为大小相同的n个region,可以有计划的对region进行回收,而不想其他收集器,必须对整个年轻代或者整个老年代回收。当需要进行垃圾收集的时候,g1会维护一个region优先手机列表,根据允许的收集时间来觉得对那些region进行最高效的回收。

      4、g1的垃圾回收是针对于region来做的,这就产生了一个问题,可能当前收集的region中对象,会跟其他没有分配收集region中的对象有关联关系,这一般就需要全局扫描,很耗费时间,但是g1中,region之间的对象引用都使用一个叫Remembered Set来记录,每一个region都有一个set,虚拟机发现对引用类型数据操作时,会检查引用是否处于一个region中,如果不是则记录到set中去。这样在回收region的时候,只需要查看set就能做到对其余region回收的不遗漏。

      5、g1垃圾收集过程:初始标记(stop the world)-并发标记-最终标记(stop the world)-筛选回收(stop the world)

  三、空间分配担保

    都知道,gc回收分年轻代和老年代,当使用复制算法进行回收的时候,会将当前使用的eden和suviovor中的可用对象,复制到另外一个siuvivor中。这时候,如果suvivor中的空间装不下可用的对象,那么怎么办呢?这就是空间分配担保要解决的问题,会将一些年轻较大的对象移动到老年代。那么在年轻代进行minor gc的时候,会进行什么操作?首先会检查老年代的最大可用空间是否大于新生代所有对象的总和,如果成立可以保证直接可以进行gc。如果不成立,那么有一个担保失败的参数,如果该参数设置为允许,那么继续检查老年代最大可用连续空间是否大于历次晋升到老难带对象的平均大小,如果大于,那么直接进行minorgc,否则那么直接进行一次fullgc。当然这里也是有风险的,可能虽然可用连续空间是否大于历次晋升到老难带对象的平均大小,但是这次直接大于不够了,如果不够的话,也只能重新进行一次fullgc了。

  

      

    

转载于:https://www.cnblogs.com/guoliangxie/p/7384661.html

五、jvm垃圾回收3(几种垃圾收集器)相关推荐

  1. 【探究JVM九】深入理解JVM垃圾回收的8种算法

    文章目录 1. 垃圾回收概述 什么是垃圾 为什么需要GC 对象是否存活 2. 标记阶段-引用计数算法 3. 标记阶段-可达性分析算法 GC Roots 4. 对象的finalize机制 生存?还是死亡 ...

  2. [JVM-3]Java垃圾回收(GC)机制和垃圾收集器选择

    哪些内存需要回收? 1.引用计数法 这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1:当引用失效时,计数器值-1.任何时刻计数值为0的对象就是不可能再被使用的.这 ...

  3. Java垃圾回收之老年代垃圾收集器

    1.Serial Old 收集器(-XX: +UseSerialOldGC, 标记-整理算法) 单线程收集,进行垃圾收集时,必须暂停所有工作线程 简单高效,Client模式下默认的老年代收集器 2.P ...

  4. java 老年代回收_Java垃圾回收之老年代垃圾收集器

    1.Serial Old 收集器(-XX: +UseSerialOldGC, 标记-整理算法) 1.1 单线程收集,进行垃圾收集时,必须暂停所有工作线程 1.2 简单高效,Client模式下默认的老年 ...

  5. JVM的7种垃圾收集器

    原文地址:Java虚拟机垃圾回收(三) 7种垃圾收集器 Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中 ...

  6. JVM垃圾回收算法与原理详解

    垃圾回收 参考文档 GC参考手册-Java版 理解Java的强引用.软引用.弱引用和虚引用 JVM系列(五) - JVM垃圾回收算法 如何判断对象可以回收 引用计数法 参考文章 Java JVM的引用 ...

  7. 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了

    本文来源:码海 前言 Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不 ...

  8. 【JVM】JVM垃圾回收机制GC

    文章目录 JVM垃圾回收机制 一.堆内存区域划分 1.1内存分配策略 1.2永久代(Permanent Generation) 1.3元空间(MetaSpace) 二.标记算法 2.1引用计数算法 2 ...

  9. 【<JVM垃圾回收专题>】

    这里写目录标题 [1] 垃圾回收的场所及原因? [2] 为什么学习GC和如何学习GC? [3] JVM如何判定一个对象是否应该被回收? [4] 在java中为什么不推荐使用finalize [4] 详 ...

最新文章

  1. explain 之key rows extra
  2. springboot+sockjs进行消息推送(一对一模式)
  3. Oracle ROWNUM的陷阱
  4. linux安装rz命令_Linux 安装dep安装包命令
  5. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
  6. Spring AOP原理分析(二)--@EnableAspectJAutoProxy功能分析
  7. XP下免U盘安装Ubuntu 18.04(持续更新遇到的问题,20200422更新)
  8. 小学班级计算机社团活动章程,小学腾飞电脑小社团活动章程.doc
  9. win7网络不显示共享计算机,Win7电脑已开启共享却找不到设备 局域网显示空白该怎么解决...
  10. java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?
  11. guitar chord html5,‎App Store 上的“吉他和弦(基本): GUITAR CHORD”
  12. 基于python网络爬虫天气_Python网络爬虫之中国天气网
  13. 【BLE】BQB认证
  14. Matlab获取tif各格点经纬度
  15. Type-c接口及其协议介绍
  16. 【APP渗透测试】 Android APP渗透测试技术实施以及工具使用(客户端服务端)
  17. Elasticsearch CCR源码分析(补充)
  18. 迈阿密大学计算机学科排名,迈阿密大学计算机科学(论文)专业介绍_计算机科学(论文)专业排名及就业方向和前景-小站留学...
  19. 流利说英语level4_英语流利说-懂你英语Level4Unit1Part1
  20. 青云QingCloud 在不同场景化中的云计算应用

热门文章

  1. 程序员面试题精选100题(12)-从上往下遍历二元树[数据结构]
  2. 深度学习(十八)基于R-CNN的物体检测-CVPR 2014-未完待续
  3. 阿里云城市数据大脑开发规范
  4. 一个小型的网页抓取系统的架构设计
  5. 如何设置windows下xampp的phpMyAdmin外网访问?
  6. spring+mybatis+springmvc项目配置
  7. 在 MySQL 中查找含有目标字段的表
  8. .Net程序猿玩转Android开发---(7)相对布局RelativeLayout
  9. Spread Studio for .NET 7: 使用现有数据填充单元格
  10. 设计模式-观察者模式(Observer)