典型的垃圾回收算法

Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做2件基本的事情:

(1)发现无用信息对象;

(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。

大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。

垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。

引用计数法(Reference Counting Collector)

引用计数法是唯一没有使用根集的垃圾回收算法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1。当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。

基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,适宜地必须 实时运行的程序。但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量 ,计数器加1,而每次现有对象出了作用域生,计数器减1。

时间: 2024-10-07 20:43:17

典型的垃圾回收算法的相关文章

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

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

Java中的垃圾回收算法

1)垃圾回收的两个关键要素: 发现无用对象. 回收无用对象的内存空间. 2)6种垃圾回收算法 引用计数法,tracing 算法,compacting算法,copying 算法,generation算法,adaptive算法. 3)detail: 引用计数法(Reference Counting Collector)引用计数法是唯一没有使用根集的垃圾回收的法,该算法使用引用计数器来区分存活对象和不使用的对象.一般来说,堆中的每个对象对应一个引用计数器.当每一次创建一个对象并赋给一个变量时,引用计数

HotSpot 虚拟机垃圾回收算法实现

作为使用范围最广的虚拟机之一HotSpot,必须对垃圾回收算法的执行效率有严格的考量,只有这样才能保证虚拟机高效运行 枚举根节点 从可达性分析中从 GC Roots 节点找引用链这个操作为例,可以作为 GC Roots 的节点主要在全局性的引用(例如常量或者类静态属性)与执行上下文(例如栈帧中的本地变量表)中. 但是现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多的时间. 另外,可达性分析对执行时间的敏感还体现在 GC 停顿上,因为这项分析工作必须在一个能确保一致

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

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

谈谈JVM垃圾回收机制及垃圾回收算法

一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”.垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存. ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其

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是无

可视化垃圾回收算法

链接:blog.jobbole.com/77280/ github.com/kenfox/gc-viz 大部分开发者都认为自动垃圾回收器是理所当然的.实际上,这只是语言运行时提供的一项实用功能,旨在简化我们的开发工作. 但是如果尝试着了解垃圾回收器的内部原理,你会发现很难弄明白.除非熟悉它的工作流程和错误处理方式,否则内部成千上万的实现细节会让你不知所措. 我编译了一个有五种不同的垃圾回收算法工具.程序运行时会创建一个动画界面.你可以从github.com/kenfox/gc-viz上获取动画和