垃圾回收算法(1)-----标记计数法

标记计数法(Reference Counting)

主要内容

  对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1.只要对象A的引用计数器的值为0,则对象A就不可能再被使用。

主要缺点

  可能造成循环引用,无法回收的情况。例如,如下图,我们构造了一个列表,我们将最后一个元素的next属性指向第一个元素,即引用第一个元素,从而构成循环引用;这个时候如果我们将列表的头head赋值为null,此时列表的各个元素的计数器都不为0,同时我们也失去了对列表的引用控制,从而导致列表元素不能被回收!

  引用资料:http://blog.csdn.net/hou478410969/article/details/7530032

时间: 2024-10-08 05:51:29

垃圾回收算法(1)-----标记计数法的相关文章

垃圾回收算法(2)-----标记清除法

标记清除法 原理 标记清除算法是现在垃圾回收算法的基本思想.大概分为两个阶段:标记阶段和清除阶段.在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象.因此,未被标记的对象就是未被引用的垃圾对象.在清除阶段,清除所有未被标记的对象. 从图上可以看到,不可达的垃圾对象被清除了,而从根节点可以到达的对象,都存活了下来. 缺点 标记清除算法最大的问题是会造成内存碎片,在图上可以很清除的看见,在存活对象周围的,生成了大大小小不一样的碎片,不连续的内存空间的工作效率要低于连续的空间,后面的算法也会解

java垃圾回收算法之-标记清除

博文在我的csdn博客中: http://blog.csdn.net/linsongbin1/article/details/51577310

垃圾回收算法(5)分代回收

分代垃圾回收,基于的是“大部分的对象,在生成后马上就会变成垃圾”这一经验上的事实为设计出发点.此前讨论过基于引事实的另一个垃圾回收算法,引用计数出的一些优化思路. 分代的关键是: 给对象记录下一个age,随着每一次垃圾回收,这个age会增加: 给不同age的对象分配不同的堆内内存空间,称为某一代: 对某一代的空间,有适合其的垃圾回收算法: 对每代进行不同垃圾回收,一般会需要一个额外的信息:即每代中对象被其他代中对象引用的信息.这个引用信息对于当前代来说,扮演与"root"一样的角色,也

垃圾回收算法之引用跟踪算法

在<垃圾回收算法之引用计数算法>这篇博客里,我们说到了引用计数算法的缺陷:会造成循环引用的问题.本篇的引用跟踪算法则客服了这种缺陷. 在引用计数算法中,对于每个引用的对象,我们有一个额外的字段专门计数这个对象被引用的次数,当次数为0时,则视为垃圾.那在引用跟踪算法中,我们如何判断这个对象是垃圾呢?答案是:对象可达图. 一.对象可达图 它的含义是,首先将所有的对象标记为垃圾并将它们视为根,从根出发,将所有的正在使用的对象串联起来,直至完毕,不被串联的对象即为"不可达",即被视

Java虚拟机四:垃圾回收算法与垃圾收集器

在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内存就回收了.但是方法区和堆区不一样,一个接口或者实现类所需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,只有程序运行时才能知道创建哪些对象,这部分内存的分配和回收是动态的. 在进行垃圾回收时候,首先需要判断哪些对象需要回收,这就涉及到回收算法的问题. 一.垃圾回收算法 1.标记-清除

直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象.然后,在清除阶段,清除所有未被标记的对象. 适用场合: 存活对象较多的情况下比较高效 适用于年老代(即旧生代) 缺点: 容易产生内存碎片,再来一个比较大的对象时(典型情况:该对象的大小大于空闲表中的每一块儿大小但是小于其中两块儿的和),会提前触发垃圾回收 扫描了整个空间两次(第一次:标记存活对象:第

java----java垃圾回收算法

1.引用计数法(Reference Counting Collector) 1.1算法分析 引用计数是垃圾收集器中的早期策略.在这种方法中,堆中每个对象实例都有一个引用计数.当一个对象被创建时,且将该对象实例分配给一个变量,该变量计数设置为1.当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1.任何引用计数器为0的对象实例可以被当作垃圾收集.当一个对象实例被垃圾收

常用垃圾回收算法

今天我关于常见的垃圾回收算法来做个总结,我们最常听到的是Java虚拟机里的垃圾回收机制,其实垃圾回收的概念最先并不是Java里首先提出来的, 垃圾回收这个概念很早就已经被提出来了,并且已经在其他语言中得到了应用. 关于垃圾回收的机制,这里不再解释,这篇文章我主要介绍常见的垃圾回收算法,当然还有其他的. 算法一:引用计数法. 这个方法是最经典点的一种方法.具体是对于对象设置一个引用计数器,每增加一个变量对它的引用,引用计数器就会加1,没减少一个变量的引用, 引用计数器就会减1,只有当对象的引用计数

常用的垃圾回收算法

引用计数法 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1. 只要A对象的引用计数器的值为0,则对象A就不可能再被使用. 实现也很简单,只需要为每个对象配备一个整型的计数器即可. 缺点: 1.无法处理循环引用的情况 2.引用计算器要求在每次引用产生和消除的时候,需要伴随一个加法操作和减法操作,对系统性能有一定影响. A引用了B,B又引用了A,因此A和B的引用计数器都不为0,但是系统中却 不存在任何第3个对象引用了A和B. 这种情况下,A和B是无