`
百合不是茶
  • 浏览: 354898 次
社区版块
存档分类
最新评论

垃圾收集器标记原理

阅读更多

 

 

   java虚拟机完成收集需要三个步骤;

                        1,哪些内存需要回收,2,什么时候回收,3,如何回收

 

 

 

标记回收的对象:

     java虚拟机在回收Java堆中的对象之前需要将其标记是否存活

 

 

 

回收对象的标记方法;

    

 1, 引用计数法;给对象添加一个计算器,有引用时i++,没有就i--;当任何时刻都为0 表明其已经死亡

 

 

2,根搜索算法;通过"GC roots"的对象作为起点,从这些节点往下搜索,当没有引用链相连时,则表示此对象是不可用的;(类是链表)

 

     JAVA中可以作为GC roots的对象的包含下面四种;  

         虚拟机栈(栈帧中的本地变量表)中的引用对象

        方法区中的类静态属性引用的对象

        方法区中的常量引用的对象

        本地方法栈中的JNI的引用的对象

 

 

 

3,对象的标记

      标记对象的死亡至少需要标记两次,第一次进行筛选,第二次标记死亡

 

 

4,方法区的回收

 

     在java中一般在java堆中回收的效率要高于方法区的效率,特别是java堆中的新生代中的标记

 

     

 

 

      

 

垃圾收集算法;

    

      标记---清除算法

      

     最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经基本介绍过了。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 标记-清除算法的执行过程如图3-2所示。

 
图3-2 “标记-清除”算法示意图

 

 

 

 

     2,复制算法

   

     

为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,未免太高了一点。复制算法的执行过程如图3-3所示。

 

 

 

3 标记-整理算法

复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以

外的内存,“标记-整理”算法的示意图如图3-4所示。

 

 

 

4 分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象的存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0
2
分享到:
评论

相关推荐

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

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

    Python垃圾收集器原理研究及应用.pdf

    本文由郭芬和刘明撰写,分别来自美博通通信技术和上海惠普公司,深入探讨了Python垃圾收集器的工作原理以及在实际应用中的策略。 Python垃圾收集器主要基于引用计数和周期性垃圾收集两种机制。引用计数是最基础的...

    Java的垃圾收集器(GC)

    ### Java的垃圾收集器(GC)详解 #### 引言 垃圾收集器(Garbage Collector,简称GC)是Java语言的一项重要特性,它自动化管理内存,显著减轻了开发者手动管理内存负担,避免了常见的内存泄漏问题,提高了程序的...

    垃圾收集机制的基本原理及方法word版

    - **垃圾收集器**:JVM使用不同的垃圾收集器策略,如分代收集、标记-清除、复制、标记-压缩等,来优化内存管理。分代收集将堆分为年轻代和老年代,以适应不同生命周期的对象。 - **可达性分析**:垃圾收集器通过...

    计算机专业外文翻译(Java垃圾收集器)

    这篇3000字的毕业设计论文外文翻译主要探讨了Java垃圾收集器的工作原理及其对性能的影响。 在传统的编程语言如C++中,堆内存的分配通常比较昂贵,因为程序员需要手动管理内存,包括对象的创建和销毁。然而,Java...

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

    理解JVM垃圾收集器的工作原理和使用场景对于优化Java应用的性能至关重要。选择合适的垃圾收集器配置,结合不同年代的内存管理策略,可以有效避免内存溢出,提高系统响应速度。在面试中,展示对这些知识点的掌握将有...

    Java的垃圾收集器(GC)可用.pdf

    Java提供了多种不同的垃圾收集器策略,如串行GC、并行GC、并发标记扫描GC(CMS)和G1 GC等,它们各有优缺点,适用于不同的场景和性能需求。例如,串行GC适合小型应用或单线程环境,而并行GC和并发GC则更适合多处理器...

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

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

    如何实现一个垃圾收集器 - 知乎1

    虽然它可能无法达到生产环境的要求,但这个过程有助于理解垃圾收集器的工作原理,为更复杂实现打下基础。在实践中,理解像Epsilon GC这样的基础组件,以及如何在它们之上构建功能,对于深入理解垃圾收集器的内部机制...

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

    2. **内存回收策略**:Java虚拟机(JVM)提供了多种不同的垃圾收集器,如串行GC、并行GC、并发标记清除GC、G1 GC等,它们采用不同的策略进行内存回收。例如,串行GC适合轻量级应用,而并行和并发GC则适用于多核...

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

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

    200 行 C 代码编写你的第一个垃圾收集器

    通过学习和实践这个小型的 C 语言垃圾收集器,开发者可以更好地理解和掌握内存管理的原理,为编写更高效、更健壮的程序打下基础。同时,这也是向更高级的垃圾收集技术,如 Java 或者 .NET 中的 GC 机制迈出的第一步...

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

    Java的垃圾收集器(Garbage Collector,简称GC)是Java平台的一个重要特性,它负责自动管理程序中的内存,避免手动内存管理可能导致的...了解不同类型的垃圾收集器及其工作原理,对于Java应用程序的性能调优至关重要。

    垃圾收集的原理浅析[文].pdf

    自动垃圾收集是指由虚拟机或垃圾收集器自动管理内存的过程,而手动垃圾收集是指由开发者手动管理内存的过程。 自动垃圾收集的优点是可以减少开发者的工作量,提高开发效率,但它也存在一些缺陷,例如可能会增加程序...

    计算机科学与技术-外文翻译-外文文献-英文文献-Java垃圾收集器的工作方式.doc

    垃圾收集器的工作主要包括两个主要阶段:标记和清除。首先,它会遍历所有可达的对象,标记它们为活跃状态。接着,那些未被标记的对象就被认为是垃圾,可以被安全地回收。在这个过程中,垃圾收集器还会执行压缩操作,...

    C的保守垃圾收集器

    3. **保守垃圾收集**:详细阐述保守垃圾收集器的工作原理,如何通过扫描堆栈和寄存器来确定对象是否被引用,以及如何处理无法精确识别的情况,如无法区分指针和普通数值。 4. **实现细节**:可能涉及如何在C语言中...

    mark-sweep:C语言中一个简单的标记清除垃圾收集器

    然而,为了理解和学习内存管理以及垃圾收集的工作原理,我们可以实现一个简单的垃圾收集器。本篇将详细讲解"mark-sweep"算法,这是一种经典的垃圾收集策略,适用于C语言环境。 "Mark-Sweep"算法主要分为两个阶段:...

Global site tag (gtag.js) - Google Analytics