首页 > 编程语言 >垃圾回收算法(1)-引用计数法

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

时间:2022-09-20 15:44:46浏览次数:52  
标签:对象 计数器 回收 计数法 计数 算法 引用 垃圾

算法原理

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

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

String p = new String("abc")

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

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

p = null

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

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

严重问题

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

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

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

标签:对象,计数器,回收,计数法,计数,算法,引用,垃圾
From: https://www.cnblogs.com/leepandar/p/16711271.html

相关文章

  • Problem P19. [算法课贪婪]三角形的最大周长
    贪心:选三个最长的边组成三角形,如果最长的三个边不能组成,那么这时候无论把第二和第三大的边换成什么都不可能能够和最大的边组成三角形,这时候就必须把最大的边给换掉,把最......
  • 计算机系统结构大题精讲-考点一页面替换算法
    一、FIFO页面替换算法1、有一个虚拟存储器,主存有4个实页,页号为0-3;程序有8个虚页,页号为0-7;采用FIFO算法和全相连映像。给出如下程序页地址流:2、3、5、2、4、0、1、2、4、6......
  • Problem P20. [算法课蛮力法]种花问题
    我写的并不好,力扣上有比这更好的方法我的思路:从头遍历数组,检查位置是否能放下花,能放就放下,然后检查下一个位置,注意放下之后就改变了数组。然后就是注意前后数组越界,注意......
  • V8 的垃圾回收机制
    一、基本概念 1.1对象/头/域对象这个词,在不同的使用场合其意思各不相同。比如,在面向对象编程中,它指“具有属性和行为的事物”,然而在GC的世界中,对象表示的是“通过应......
  • 学习-数组相关算法-两数之和
    obj[1]=111letobj={"5":222}console.log(obj[5])////222console.log(obj['5'])//222//console.log(obj.5)这样写会报错obj[1]=111console.log(JSO......
  • 数据结构算法与应用:C++语言描述(第2章 程序性能)
    目录2.1引言2.2空间复杂性(spaceComplexity)\(S_p(n)\)2.2.1空间复杂性的组成2.2.2举例2.3时间复杂性(timecomplexity)\(T(n)\)2.3.1时间复杂性的组成2.3.2操作计......
  • 数据结构算法与应用:C++语言描述(第2章 程序性能)
    目录2.1引言2.2空间复杂性(spaceComplexity)\(S_p(n)\)2.2.1空间复杂性的组成2.2.2举例2.3时间复杂性(timecomplexity)\(T(n)\)2.3.1时间复杂性的组成2.3.2操作计......
  • fh-2022算法考试编程题-2
    小A有一套特殊的卡牌,他们是1-N的数字的排列,每个数字有且仅有一张卡。小A在洗牌之后,会把卡牌并排放在地上。小A总是在通过卡牌的交换位置来获得1,2,3....N的序列。假如初......
  • 模拟退火算法
    ​ 模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温......
  • 算法—链表合并问题
    题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解法一:递归publicListNodemergeTwoLists(ListNodelist1,......