`
从此醉
  • 浏览: 1041261 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

JVM学习之:GC的算法的具体实现(垃圾收集器)

 
阅读更多

在 JVM学习之:GC的算法简述 这篇博客中提到了各种各样的垃圾算法,由于java屏蔽掉了程序员对内存的管理,其根据这些算法的特点实现了很多的的垃圾收集器,每个垃圾收集器都有自己的优点,使用场合,当然也有各自的缺点,所以在实际的应用中往往会更具应用的特点选择不同的垃圾收集器来组合使用,目前还没有一款"万能通"的收集器能应用在所有的场合,为了能够更好的熟悉这些收集器,对常用的垃圾收集器做一下总结,如下图



如果两个收集器之间有实线链接表明两个收集器可以一起使用,每个收集器的特点从https://blogs.oracle.com/jonthecollector/entry/our_collectors可以找到介绍,本人添加了一些中文的描述

  • "Serial" is a stop-the-world, copying collector which uses a single GC thread.
    特点:虽然说他是stop the word,而且是单线程的,但是到目前为止,它任然是虚拟机运行在client模式下的默认年轻代的收集器
    优点:由于单线程而简单高效,对于单处理器的情况下是个不错的选择

  • "ParNew" is a stop-the-world, copying collector which uses multiple GC threads. It differsfrom "Parallel Scavenge" in that it has enhancements that make it usable with CMS. For example, "ParNew" does the synchronization needed so that it can run during the concurrent phases of CMS.
    特点:(1)运行在server模式下虚拟机的首选年轻代收集器
    (2)对于单处理器的环境下,由于多个收集器线程之间的切换也会带来一定的开销,所以该收集器的效率不一定会比Serial效率高
    (3)默认的情况下,开启的线程数和处理器的数量相等
    参数: 可以通过-XX:ParalleLGCThreads来限制垃圾收集器线程的数量


  • "Parallel Scavenge" is a stop-the-world, copying collector which uses multiple GC threads.
    特点:(1)其他收集器关注点是尽可能的缩短因为收集线程的运行而导致用户线程的停顿时间,而该收集器的参考指标是吞吐量(吞吐量=用户代码运行时间/用户代码运行时间+GC时间)
    (2)收集器的高吞吐量表明对CPU的利用率比较高,尽快的完成程序的运算任务,适用于CPU密集型的操作,不适合有太多交互的操作
    (3)
    参数:-XX:MaxGCPauseMills 最大垃圾收集停顿时间,
    --XX:GCTimerRatio 吞吐量的倒数
    -XX:+UseadaptivesizePolicy 开启虚拟机的自适应调整策略,该参数为
    Parallel Scavenge收集器特有
  • "Serial Old" is a stop-the-world,mark-sweep-compact collector that uses a single GC thread.
    特点:(1)主要用在虚拟机的Client模式下
    (2) 如果用在虚拟机的Server模式下主要用来和
    Parallel Scavenge搭配使用,以及作为CMS的backup

  • "Parallel Old" is a compacting collector that uses multiple GC threads.
    特点:(1)从jdk1.6才开始被使用,在此之前由于Parallel Scavenge与CMS有这不同的实现结构,所以只能和Serial Old搭配使用,但是由于Serial Old是单线程的,如果在Server模式下的话,会导致Old Generation区的回收效率问题,所以Effective(Parallel Scavenge+Serial Old)<Effective(parNew+CMS),所以在此之前Parallel Scavenge的处境比较尴尬
    (2)在注重吞吐量以及Cpu利用率的场合可以优先考虑使用
    Parallel Scavenge+Parallel Old
    说的
  • "CMS(Concurrent mark Sweep)" is a mostly concurrent, low-pause collector.
    特点:(1)对Old Generation的并发收集
    (2)非常重视交互的响应性,例如互联网的网站等B/S系统服务器
    (3)该收集器对比与前面的几种收集器更为复杂,其工作的过程大概分为四个阶段 一:初始标记 二:并发标记 三:重新标记 四:并发清楚,其中步骤一和三会要求Stop the world,而步骤二和四可以和用户线程一起工作.消耗时间的大小顺序为 一<三<二<四
    缺点:(1)对于CPU资源非常敏感,CMS默认启动的收集器线程数是(CPU数量+3)/4,当CPU大于4时,垃圾收集线程最多占用不超过25%的cpu资源,但是当CPU数小于4时,那么CPU的可能就要有一半的资源在垃圾收集上,为了解决这种问题提供了一种i-CMS的解决方案
    (2)无法处理浮动垃圾,可能出现"Concurrent Mode Failure"而导致另外一次Full GC的产生.在默认的情况下当老年区使用了68%以上时就会触发GMS垃圾回收,这个参数可以通过-XX:CMSInitiatingOccupancyFraction来设置这个触发的值,这个参数设的过低会导致频繁的发生垃圾回收造成资源的浪费,如果设的太高,那么浮动垃圾占用了大量old generation,而导致用户程序没有足够的内存空间去运行,于是就出现了Concurrent Mode Failure,出现Concurrent Mode Failure时,虚拟机会使用CMS的backupSerial Old作为old generation的回收器
    (3)由于用的Mark-Sweep算法,所以运行期间会有大量的内存碎片产生.为了解决这个问题可以通过使用-XX:+UseCMSCompactAtFullCollection来让虚拟机在昨晚FUll Gc后做一次碎片整理工作(STOP the world),碎片的整理需要时间,所以设置这个参数后会导致停顿时间的加长,为此Sun又提供了一个参数(-XX:CMSFullGCsCompaction)用来设置当执行完多次的非压缩Full GC后,做一个带压缩的FUll GC
  • G1:will be supported in jdk 7.0

  • 下面提供了一些虚拟机参数用来设置虚拟机使用那些收集器:

    Using the -XX flags for our collectors for jdk6,


  • UseSerialGC is "Serial" + "Serial Old"
  • UseParNewGC is "ParNew" + "Serial Old"
  • UseConcMarkSweepGC is "ParNew" + "CMS" + "Serial Old". "CMS" is used most of the time to collect the tenured generation. "Serial Old" is used when a concurrent mode failure occurs.
  • UseParallelGC is "Parallel Scavenge" + "Serial Old"
  • UseParallelOldGC is "Parallel Scavenge" + "Parallel Old"

    还有一些关于收集器的FAQ请参见:https://blogs.oracle.com/jonthecollector/entry/our_collectors


  • 分享到:
    评论

    相关推荐

      JVM初探- 内存分配、GC原理与垃圾收集器

      JVM初探- 内存分配、GC原理与垃圾收集器,从从提上讲解了jvm中GC的原理、基本的算法和针对不同内存区使用的算法,同时,详细的讲解了当前主要使用的垃圾收集器

      JVM 知识点整理:GC垃圾收集器及相关算法

      JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...

      GC算法和收集器.pdf

      GC算法和收集器,如何判断对象可以被回收,垃圾回收算法,垃圾收集器,调优步骤,GC常用参数等等一些gc问题

      JVM学习笔记核心知识点整理

      JVM学习笔记核心知识点整理,包含类文件加载机制,运行时数据,JVM内存模型,GC算法,垃圾收集器分类等

      深入java虚拟机

      1. JVM调优 1.1 JVM调优总结(一)-一些概念 1.2 JVM调优总结(二)-一些概念 1.3 JVM调优总结(三)-基本垃圾回收算法 1.4 JVM调优总结(四)-垃圾...4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM

      编程文档JVM、Java基础、.rar

      Java引用,GC垃圾收集器,OOM 类加载,类加载器 对象初始化 编译 JiT:即时编译 两大无关性 平台无关性: 每一台平台解释器不同,但是虚拟机相同,跨平台的原因。 一个程序对应一个虚拟机,多个程序对应多个虚拟机...

      resin-jvm 调优

      Bea JRockit JVM支持4种垃圾收集器: 4.1.1.分代复制收集器 它与默认的分代收集器工作策略类似。对象在新域中分配,即JRockit文档中的nursery。这种收集器最适合单cpu机上小型堆操作。 4.1.2.单空间并发收集器 该...

      Java-JVM优化视频.zip

      网盘文件永久链接 目录 day1: 1 为什么要对jvm做优化 2 jvm的运行参数 3 jvm的内存模型 ...3 垃圾收集器以及内存分配 4 可视化GC日志分析工具 day3: 1 Tomcat8优化 2 JVM字节码 3 代码优化 .........

      深入理解JVM内存结构及运行原理全套视频加资料.txt

       第40讲 垃圾收集器-parallel收集器详解 00:11:02  第41讲 垃圾收集器-cms收集器详解 00:14:58  第42讲 最牛的垃圾收集器-g1收集器详解 00:18:04  第43讲 内存分配-概述 00:04:23  第44讲 内存分配-Eden...

      JVM优化|java虚拟机优化

      - 了解下我们为什么要学习JVM优化 - 掌握jvm的运行参数以及参数的设置 ...- 学习串行、并行、并发、G1垃圾收集器 - 学习GC日志的可视化查看 - Tomcat8的优化 - 看懂Java底层字节码 - 编码的优化建议

      谈谈你对垃圾回收机制的了解?.docx

      可达性分析:这种类型的垃圾收集通常叫做跟踪性垃圾收集器。 原理很简单,就是将对象即及引用关系看着一个图。选定活动对象作为 GC Roots,然会跟踪引用链,如果一个对象和GC Roots之间不可达,也就是说不存在引用链...

      JVM深入理解及调优.ppt

      公司内部分享的ppt,主要内容:1)Java发展史概述 2)JVM内存模型 3)GC算法 4)HotSpot内存管理 5)垃圾收集器 6)JVM调优

      超硬核!!!一篇文章搞定整个JVM的垃圾回收系统

      JVM的垃圾回收机制JVM的垃圾回收机制1 什么是垃圾回收机制2 finalize方法作用3 新生代、老年代、永久代(方法区)的区别3.1 为什么要这样分代:3.2 Minor GC、Major GC、Full GC区别及触发条件4 如何判断对象是否存活...

      【JVM和性能优化】2.垃圾回收器和内存分配策略

      Compact)GC算法综合用年轻代老年代永久代枚举根节点安全点安全区域GC回收器Serial 收集器ParNew 收集器Parallel Scavenge 收集器Serial Old 收集器Parallel Old 收集器CMS 收集器G1 收集器ZGCSTW实现内存分配与回收...

      java虚拟机知识点整理

      虚拟机GC垃圾回收收集器(内存回收具体实现) 对象内存分配 虚拟机性能监控与故障处理工具 内存溢出问题及调优 类文件结构 虚拟机类加载机制 编译期编译优化 运行期优化 高效并发-java内存模型与线程 线程安全与锁优化...

      简单理解JVM垃圾回收

      文章目录如何判断一个对象是垃圾垃圾回收算法分代收集算法垃圾收集器相关知识总结 如何判断一个对象是垃圾 我们都知道了当堆中的区域没有足够内存去存放对象时就会触发垃圾回收,那么如何来判断一个对象是不是垃圾呢...

      Java新生代老年代的划分及回收算法

      Java堆是垃圾回收器管理的主要区域,百分之九十九的垃圾回收发生在Java堆,另外百分之一发生在方法区,因此又称之为”GC堆”。根据JVM规范规定的内容,Java堆可以处于物理上不连续的内存空间中。 当前JVM对于堆的...

      JVM原理与调优实战下载即用

      最好使用并行收集器,因为并行收集器速度比串行吞吐量高,速度快。 当然,服务器一定要是多线程的 设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3。 默认的就是1:2 减少GC对老年代的回收。设置生代带垃圾对象...

      JAVA核心知识点整理.7z

      2 JVM、2.1线程、2.2JVM内存区域、JVM运行时内存(新生代、Eden区、ServivorFrom、ServivorTo、MinorGC的过程、老年代、永久代)、2.4垃圾回收与算法 2.5java四种引用类型 2.6 GC分代收集算法vs分区收集算法 2.7 GC...

      大厂真题之京东-Java实习生

      即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象是否有必要执行 finalize() 方法,对象必须重写 finalize()方法且没有被运行过。2)若有必要执行,会把对象放到一个 队列中,JVM 会开一个线程去回收...

    Global site tag (gtag.js) - Google Analytics