美文网首页Java
垃圾回收算法(1)-引用计数法

垃圾回收算法(1)-引用计数法

作者: 一觉睡到丶小时候 | 来源:发表于2020-07-07 11:41 被阅读0次

算法原理

引用记数法在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活的对象,哪些是已经死亡的对象,只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间。

比如说,当我们编写以下代码时

String p = new String("abc")

abc这个字符串对象的引用计数值为1.


图片.png

而当我们去除abc字符串对象的引用时,则abc字符串对象的引用计数减1

p = null
图片.png

由此可见,当对象的引用计数为0时,垃圾回收就发生了。

引用计数算法很简单,它实际上是通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,
如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。

严重问题

引用记数法有一个严重的问题,即无法处理循环引用的情况。一个简单的循环引用问题的描述如下:有对象A和对象B,对象A中含有对象B的引用,对象B中含有
对象A的引用。此时,对象A和对象B的引用计数器都不为0,但是在系统中却不存在任何第3个对象引用了A或B。也就是说,A和B是应该被回收的垃圾对象,但是由于
垃圾对象之间相互引用,从而使垃圾回收器无法识别,引起内存泄漏。

图片.png

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

引用计数器拥有一些特性,首先它需要单独的字段存储计数器,这样的做法增加了存储空间的开销。其次,每次赋值都需要更新计数器,这增加了时间开销。再者,垃圾对象便于辨识,只要计数器为0,就可作为垃圾回收
,接下来它能方便及时的回收垃圾,没有延迟性最后不能解决循环引用的问题,正是由于最后一条知名缺陷,导致在java的垃圾回收器中没有使用这类算法。

个人博客
腾讯云社区
掘金
CSDN
公众号:

wx.jpg

相关文章

  • 垃圾回收-GC

    1. 垃圾回收算法 垃圾回收算法包括引用计数算法、标记整理、标记复制、标记清除。 1). 引用计数算法 引用计数算...

  • JVM垃圾回收

    GC垃圾回收流程 垃圾收集算法 垃圾回收算法 引用类型 垃圾回收的时机 1.垃圾收集算法 (1).引用计数算法含义...

  • Javascript 引用计数法的原理和优缺点

    引用计数法是什么? 引用计数法是GC算法之一。GC算法是内存管理中,垃圾回收器完成垃圾回收,从查找垃圾、释放空间到...

  • JVM 垃圾回收机制

    垃圾回收判断算法 引用计数法 计数为0时,会被回收问题:相互引用,循环引用 可达性算法 GCRoot指向不可回收的...

  • GC原理,有哪几种GC方式?

    标记-清除 算法 引用计数法 复制算法 标记-压缩 算法 分代垃圾回收 增量式垃圾回收算法 RC Immix 算法

  • Java虚拟机之垃圾回收算法

    1. 垃圾回收器如何确定对象死亡1.1 引用计数法1.2 可达性分析法 2. 垃圾回收算法2.1 标记-清除算法(...

  • JVM——垃圾回收与算法

    前言 今天就来介绍一下垃圾回收与算法。 垃圾回收与算法 如何确定垃圾 引用计数法 在 Java 中,引用和对象是有...

  • JVM 垃圾回收算法

    垃圾回收算法分为:引用计数法、标记清除法、复制算法、标记压缩清除法、分代算法、分区算法等。 引用计数法:这是一个比...

  • JVM垃圾回收机制

    JVM垃圾回收机制 回收步骤 问题 垃圾标记算法 回收对象:堆中的对象 1.引用计数法 1.1 定义: 堆中的...

  • java垃圾回收

    判断垃圾:引用计数法,根搜索法(可达性分析) 垃圾回收算法: Mark-Sweep(标记-清除)算法 Copyin...

网友评论

    本文标题:垃圾回收算法(1)-引用计数法

    本文链接:https://www.haomeiwen.com/subject/wvraqktx.html