`

java垃圾回收算法

    博客分类:
  • jvm
阅读更多

java中的所 对象实例都是存放在堆中,垃圾回收器在对堆进行回收之前必须需要知道这些对象有哪些还"存活"着,哪些已经"死去"(不可能再被任何途径使用的对象)。

 

那么怎么确定对象是否存活,有如下一些算法,下面来看看这些算法的异同。

 

1、引用计数算法

 

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当失去引用时计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。虽然这是个不错的算法,也有一些比较著名的案例使用该算法,如:微软的COM(Component Object Model)技术、使用ActionScript3的flashplayer等而java语言并未使用该算法来管理内存,其主要原因是它很难解决对象间相互循环引用的问题。

 

2、根搜索算法

 

java、c#一些主流的商用程序语言都是采用该算法来判断对象是否存活的。该算法的基本思路就是:通过一系列的名为"GC Roots"的对象作为起始点,从这个节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时(即从GC Roots到这个对象不可达),则证明此对象是不可用的。所以它们将会被判定为是可回收的对象。

 

java中可以作为GC Roots的对象包括下面几种

 

  1. 虚拟机栈(栈帧中的本地变量表 )中的引用的对象
  2. 方法区中的类静态属性引用的对象
  3. 方法区中的常量引用的对象
  4. 本地方法栈中JNI(即一般说的native方法 )的引用的对象

jvm 垃圾 回收算法

 

    1、标记-清除算法

该算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,该算法的缺点有两个:一是效率问题,标记和清除过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

       2 复制算法

该算法是为了解决效率问题而出现的。它将可用的内存按容量划分为大小相等的两块,每次只要使用其中的一块。当这一块的内存使用完了就将还存活的对象复制到另一块上面,然后把已使用的内存空间回收,内存分配时也就不用考虑内存碎片等复杂情况了,只要移动堆顶指针,按顺序分配内存即可。该算法的代价就是将内存缩小为原来的一半,未免太高了点。现在多数商用虚拟机都采用收集算法来回收新生代,据ibm专门研究表明,新生代的对象98%都是朝生夕死所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden和两块较小的survivor空间,每次使用Eden和其中一块survivor。当回收时,将Eden和survivor中还存活着的对象一次性地拷贝到另一个survivor空间上,最后清理掉eden和才用过的survivor的空间。如HotSpot虚拟机默认Eden和survivor的大小比例为8:1,也就是说每次新生代中可用内存空间为整个新生代容量的90%(80%+10% ),只有10%的内存是会被“浪费”的。只有当survivor空间不够用时,需要依赖其他内存(这里指老年代 )进行分配担保。

       3、标记-整理算法

该算法也分为两个阶段,标记过程与标记-清除算法一致。但后续步骤不是直接对可回收的对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

       4、分代收集算法

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

    分享到:
    评论

    相关推荐

      java虚拟机垃圾回收算法

      这是一篇关于java虚拟机垃圾回收算法的论文。

      Java垃圾回收算法的简易模拟实现.zip

      Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

      Java垃圾回收新算法刍探.pdf

      Java垃圾回收算法经过数十年的发展,已经形成了几种成熟的技术。标记-清除算法是最早出现的垃圾回收算法之一,它通过标记存活的对象,然后清除那些未被标记的、不可达的对象来释放内存。引用计数算法则是另一种方法...

      java C#垃圾回收算法分析

      本文将深入探讨Java和C#中的垃圾回收算法,帮助开发者理解其工作原理和优化策略。 首先,我们要明确垃圾回收的基本概念。在程序运行过程中,会动态分配内存来存储对象。当一个对象不再被引用时,它就变成了垃圾。...

      老生常谈java垃圾回收算法(必看篇)

      老生常谈java垃圾回收算法 Java垃圾回收算法是Java虚拟机(JVM)中的一种自动内存管理机制,它可以自动将无用的对象从内存中删除,从而避免内存溢出和提高系统性能。java垃圾回收算法有多种,包括引用计数法、Mark-...

      java垃圾回收机制简述

      1. **GC Roots Tracing(根搜索算法)**:这是一种常用的垃圾回收算法,用于确定哪些对象是可达的,从而间接确定哪些对象可以被视为垃圾。在Java中,GC Roots主要包括: - 在VM栈(栈帧中的局部变量表)中的引用。 ...

      java垃圾回收器代码举例

      Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...

      Java垃圾回收详解

      ### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...

      JVM之基本的垃圾回收算法汇总

      在Java虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是自动管理内存的重要机制,它负责识别并释放不再使用的对象所占用的内存空间。...理解这些基础的垃圾回收算法有助于我们更好地调试和调优Java应用程序。

      Java垃圾回收机制总结

      Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...

      java垃圾回收及内存泄漏.pptx

      ### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、...

      垃圾回收算法与实现

      垃圾回收算法篇详细介绍了多种垃圾回收算法,包括标记-清除算法、引用计数法、复制算法、标记-压缩算法、保守式垃圾回收、分代垃圾回收、增量式垃圾回收和RCImmix算法等。这些算法各有其特点和适用场景,它们是垃圾...

      垃圾回收算法与实现,Turling

      在这个主题中,Turing垃圾回收算法是一个重要的研究方向,它在Java等语言的虚拟机实现中扮演着关键角色。 垃圾回收(Garbage Collection, GC)是编程语言中的一种机制,用于自动管理程序的内存。它自动检测和回收...

      JAVA垃圾回收面试个人总结.doc

      Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...

      Java垃圾回收原理

      ### Java垃圾回收原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制是确保程序高效运行的关键技术之一。本文将深入探讨Java中的垃圾回收机制,包括其基本原理、不同类型...

      java高级之垃圾回收机制

      通过深入理解JVM内存模型以及不同的垃圾回收算法,可以帮助我们更好地优化程序性能,提高代码质量。在实际开发过程中,合理利用JVM提供的工具和技术,可以有效地避免内存泄漏等问题,提升系统的稳定性和可靠性。

      Java垃圾回收机制

      ### Java垃圾回收机制详解 #### 一、Java垃圾回收机制概览 Java作为一种现代的、面向对象的编程语言,其一大特色就是引入了自动垃圾回收机制。这一特性极大地简化了开发人员的工作,使得他们不再需要手动管理内存...

      java垃圾回收机制

      ### Java垃圾回收机制详解 #### 一、垃圾收集的意义及背景 在计算机编程领域,特别是对于内存管理方面,Java提供了一种与C++等其他语言截然不同的方式。在C++中,对象所占用的内存资源需要程序员手动管理,这意味...

    Global site tag (gtag.js) - Google Analytics