GC算法-引用计数法
概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对象: 新建一个对象(对这个新的对象引用数量+1) 更新指针: 将一个指向A对象的指针重新指向B对象(将A对象引用数量-1, B对象引用数量+1) 这次就不上代码了, 简单介绍一下思路就行. (我哥说代码看着费劲) 前提 : 我们有一个全局的空闲地址链表: FREE_HEAD 创建对象的操作 从FREE_HEAD中寻找内存 若找到了, 该对象计数器置为1, 返回 若没有找到, 内存扩容, 返回1 更新指针的操作 将新的对象引用计数+1 将旧的对象引用计数-1. 若-1后引用数量为0, 则将该对象及所有的子对象添加到 FREE_HEAD 链表中. 实现说起来简简单单, 毕竟我也不用真的去实现, 简单想一下. 分析 在上一次的 标记清除算法 中, GC在每次内存不足时运行, 势必会导致程序暂停时间比较长. 但 引用计数 则在每次指针变更的同时进行管理, 在产生新的垃圾的时候立刻进行回收. 这就体现出它的几个优势了: 最大暂停时间短. 产生垃圾可立即回收 当然, 只说优势不说劣势都是扯犊子. 首先, 引用计数 的优势也会成为它的劣势, 计数频繁的计算, 会拖累程序的速度.