`
g21121
  • 浏览: 694701 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GC 收集器算法总结

 
阅读更多

        GC 的几种收集器应用于不同场合,他们有着不同的实现及流程,本节就将几种收集器用到的算法总结一下,更利于大家理解。默认的本节依然以HotSpot JVM 实现为基础。


        1.Mark-Sweep(标记-清理算法)
        标记-清扫/清理算法是最基础的收集算法,此算法有两个阶段:"标记"和"清理"。

        标记阶段:首先标记出所有需要回收的对象;
        清理阶段:清理之前标记过的所有垃圾对象;



 

        之所以说它是最基础的收集算法,是因为他有比较严重的缺点:
        (1)效率问题,标记和清理过程的效率都不高;
        (2)空间问题,标记清理之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

 

        2.Copying(复制算法)
        复制算法简单来讲就是将可用内存划分为两块区域(通常为相等大小),每次只使用其中的一块。当有新的活动对象加入空闲内存时,同时将源内存(From)还存活的对象一同复制到空闲内存中去,然后再将此块内存进行清理。这样使得GC 每次只要对源内存区域进行垃圾回收即可,不必再去考虑内存分配时遗留的碎片等复杂问题。分配新内存时,只需向后移动堆顶指针,按顺序分配内存即可。Copying 算法实现简单,运行高效。但是缺点也比较明显,就是需要额外的内存空间。
        正因为Copying 算法的执行效率非常高,所以在HotSpot JVM 中被用来管理新生代内存空间,HotSpot JVM 中将Heap 内存划分为新生代与老年代(注意:方法区可称为永久代,但不等于永久代)。又将新生代划分为Eden(伊甸园) 与2块Survivor Space(幸存者区) ,然在Eden -->Survivor Space 与From Survivor Space 与To Survivor Space 之间实行Copying 算法。

        HotSpot JVM 中的复制算法:



 

        商业虚拟机都采用这种收集算法来回收新生代,IBM的专门研究表明,新生代中的对象98%是朝生夕死的,所以并不需要按照1∶1的比例来划分内存空间,而是将内存分为一块较大的Eden 空间和两块较小的Survivor 空间,每次使用Eden 和其中的一块Survivor。当回收时,将Eden 和Survivor 中还存活着的对象一次性地拷贝到另外一块Survivor 空间上,最后清理掉Eden 和刚才用过的Survivor 的空间。HotSpot虚拟机默认Eden 和Survivor 的大小比例是8∶1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存是会被“浪费”的。当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor 空间不够用时,需要依赖其他内存(例如老年代)进行分配担保(Handle Promotion)。

        内存的分配担保就好比我们去银行借款,如果我们信誉很好,在98%的情况下都能按时偿还,于是银行可能会默认我们下一次也能按时按量地偿还贷款,只需要有一个担保人能保证如果我不能还款时,可以从他的账户扣钱,那银行就认为没有风险了。内存的分配担保也一样,如果另外一块Survivor 空间没有足够的空间存放上一次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代。


        3.Mark-Sweep-Compact(标记-清理-压缩算法)
        复制算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更重要的是,如果不想浪费50%的内存空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

        根据老年代的特点,提出了Mark-Sweep-Compact(标记-清理-压缩)算法,此算法在“标记-清理”算法基础上改进,在清理完成之后增加了压缩阶段,压缩阶段是将清理过后出现的内存碎片按规则进行排序整理,将碎片依次移动到heap 内存的低端压实,从而内存的高端就空出一块较大的空间。这样在新的大对象创建后就有足够的空间存储他了。

        标记-清理-压缩流程如图:



 


        4.分代收集算法

        stop-the-world 的缺点是:每一次GC收集时,所有的程序活动都将暂停直至GC 工作完毕返还控制权,然而大部分程序中的对象都具有很短的生命周期,只有少数对象会持久贮存在内存中。
        分代收集算法就是根据对象的不同生命周期分别管理,HotSpot JVM 中将对象分为我们熟悉的“新生代”,“老年代”和“永久代”分别管理。这样做的好处就是可以根据不同类型对象进行不同策略的管理,例如新生代中对象更新速度快,就会使用效率较高Copying(复制算法)。老年代中内存空间相对分配较大,而且时效性不如新生代强,就会常常使用Mark-Sweep-Compact(标记-清理-压缩)算法。



 
        5.G1算法
        G1 的原理在于将堆划分成等一系列大小的区域,每一个区域都有一个对应的remembered set 结构,用来记录指向这个区域中的地址的其他区域的指针。 在垃圾回收时,选择记录最少的一个区域进行,按找这种方式选择出来的区域,通常是有用数据最少、垃圾最多的区域,这也就是“Garbage-first”名称的由来。假如没有外部的指针指向这个区域,就可以直接回收整块区域而不用进行内存Copy。

 

  • 大小: 9.5 KB
  • 大小: 29.8 KB
  • 大小: 12.6 KB
  • 大小: 12.6 KB
  • 大小: 2.2 KB
3
4
分享到:
评论
1 楼 夏日娃 2015-03-04  

相关推荐

    GC算法和收集器.pdf

    Java垃圾回收(GC)机制是Java虚拟机...总结来说,GC机制是JVM中自动内存管理的关键技术,它包含多种算法和垃圾收集器。通过合理设置GC参数和选择合适的垃圾收集器,可以有效提升应用性能,减少垃圾收集对业务的影响。

    1_Java虚拟机(垃圾收集器和算法).pdf

    本文详细探讨了JVM中的垃圾收集器和垃圾收集算法,以帮助开发者深入理解Java虚拟机的内部运作机制。 垃圾收集(GC,Garbage Collection)是JVM的一个重要功能,用于自动释放不再使用的对象所占用的内存空间,以防止...

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

    JVM内存管理是Java虚拟机的核心机制之一,其主要包含对象的创建、内存分配、...通过对内存分配策略、对象生死判定、垃圾收集算法和垃圾收集器的理解与应用,可以更好地掌握JVM的内存管理,从而提升应用性能和稳定性。

    GC垃圾收集器.xmind

    GC垃圾收集器+GC垃圾收集算法,配合java虚拟机一起看,效果更佳,内容简洁,重要,应届小白面试必备技能

    Java的垃圾收集器(GC)

    4. **多样的回收策略**:不同版本的JVM提供了多种GC算法,包括但不限于串行收集器、并行收集器、并发标记扫描收集器以及G1收集器等。每种算法都有其适用场景和优劣,开发者可以根据应用需求选择最适合的GC策略。 ##...

    深入JVM内核—原理、诊断与优化视频教程-4.GC算法与种类

    4. **G1(Garbage-First)**:新一代的垃圾收集器,目标是实现可预测的暂停时间模型,适用于大型应用。 五、GC调优 理解并优化GC是提升Java应用性能的关键。调优包括调整堆大小、设置新生代与老年代的比例、选择...

    GC算法:GC算法

    在C++中,一些高级的内存管理库或框架可能实现了这些GC算法的变体,例如,Boost库中的池分配器和垃圾收集器可以用于实现自定义的内存管理策略。 GC的性能优化是另一个重要的话题,包括调整GC的触发时机、减少暂停...

    Java的垃圾收集器(GC)参考.pdf

    1. **对象的可达性分析**:垃圾收集器通过一系列的可达性分析算法,如引用计数法或根可达算法,来判断哪些对象是“活动的”(即仍然被程序中的其他对象引用),哪些是“无用的”(没有被任何活动部分引用)。...

    Java的垃圾收集器(GC)整理.pdf

    Java的垃圾收集器(Garbage Collector,简称GC)是Java平台的一个重要特性,它负责自动管理程序中的内存,避免手动内存管理可能导致的内存泄漏问题。Java的垃圾收集机制是基于引用计数和可达性分析算法的,其目标是...

    java虚拟机中的垃圾收集GC.pdf

    串行收集器采用复制算法来收集年轻代,并使用标记-清除-压缩算法来处理年老代。 #### 主体并发收集器 主体并发收集器主要用于解决高延迟问题,它能够在程序运行的同时进行大部分的垃圾收集工作,从而显著减少了...

    基于实时性的Java虚拟机垃圾收集算法

    **1.2 分代收集器(Generational GC)** 分代收集器基于观察到的现象——大多数对象具有短暂的生命期。这种收集器将堆空间划分为不同区域,如新生代和老年代,新创建的对象首先放在新生代中,经过多次GC后仍然存活...

    漫谈Java垃圾收集器.pdf

    * Concurrent Mark and Sweep(CMS)GC:并发垃圾收集器,使用标记-清理-整理算法。 CMS垃圾收集器的工作流程包括: 1. 初始标记:标记从roots直接可达的对象。 2. 并发标记:从young generation中标记可达的对象...

    JVM常用的GC策略介绍

    本文将详细介绍几种在JDK 1.7中常用的垃圾收集算法、策略以及垃圾收集器,帮助读者更深入地理解JVM是如何高效执行内存回收工作的。 #### 二、典型垃圾收集算法 垃圾收集算法决定了如何识别和回收不再使用的对象,...

    JVM初探内存分配GC原理与垃圾收集器共16页.pdf.z

    深入理解JVM内存分配、垃圾收集(Garbage Collection, GC)原理以及垃圾收集器的工作方式对于优化程序性能至关重要。 首先,我们要了解JVM内存结构。在Java中,内存主要分为以下几个区域: 1. **堆内存(Heap)**...

    基于实时性的Java虚拟机垃圾收集算法.pdf

    该算法对增量式收集器中的堆空间划分和引用跟踪等方面进行了改进,从而使其适用于实时性环境。 知识点1:垃圾收集机制(GC) 垃圾收集机制是Java语言的一大优势,它实现了对内存的自动收集和重用,使程序员可以...

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

    Java虚拟机(JVM)是Java程序运行的基础,其中垃圾收集器(GC)是负责自动管理内存的关键组件。GC的主要任务是识别并回收不再使用的对象,以释放内存资源。这里我们将详细探讨几种垃圾收集器和相关算法。 首先,...

    直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景

    【JVM垃圾收集器概述】 Java虚拟机(JVM)的垃圾收集器是自动管理内存的重要组成部分,负责识别不再使用的对象并释放它们所占用的内存,以防止内存泄漏。垃圾收集器的选择和配置对应用程序的性能有着显著影响,特别...

    jvm性能调优-垃圾收集器parnew&CMS底层三色标记算-performance-gc-parnew-cms.zip

    本文将深入探讨两个重要的垃圾收集器——ParNew和Concurrent Mark Sweep (CMS) ——以及它们在JVM性能调优中的作用,特别是基于三色标记算法的实现。 首先,ParNew垃圾收集器是新生代(Young Generation)的默认...

Global site tag (gtag.js) - Google Analytics