php7更可靠的垃圾回收期,php7垃圾回收算法

前言

首先回顾一下引用计数法:引用计数(reference counting)

在引用计数算法中,对象的存活性可以通过引用关系的创建或删除直接判定,而无需像追踪式回收器那样先通过堆遍历找出所有的存活对象,然后再反向确定出未遍历到的垃圾对象。

//todo

对于基于最基本的引用计数法的垃圾回收算法优点是非常快,但是缺点是循环引用的时候没法回收会造成内存泄露。而php垃圾回收算法是基于上述论文的引用计数+局部延时标记的垃圾回收算法。

第一部分

先看伪代码

// S 代表php中的对象

//purple 紫色表示对象在PossibleRoot 集合,但是在该集合中的不一定是紫色

// buffered(S) S是否在 PossibleRoot 集合

// black 黑色表示对象正在被使用或者已经被回收了(不需要管了)

//gray 棕色表示对象可能被回收

//white 白色表示对象要被回收

//RC ReferenceCount 引用计数

//color(S) S 的颜色

//当new 一个对象的时候,这时候不需要垃圾回收,这是最简单的情况

Increase(S){

RC(S) = RC(S) + 1; //引用计数 +1

color(S) = black; // 颜色染成黑色

}

//当删除一个指向S 的引用的时候

Decrease(S){

RC(S) = RC(S) - 1; //引用计数减1

if (RC(S) == 0) // 当引用计数变为0 时候

Release(S); // 调用释放函数Release()

else

PossibleRoot(S) ; //放入可能回收的PossibleRoot区域并染色成紫色purple

}

Release(S){

for T in children(S) // 递归调用减少子节点的引用

Decrement(T);

color(S)= black // 之后将该S节点染成黑色 (将被回收或者不需要回收 , 这里是前者)

if (! buffered(S)) // 判断S 是否在PossibleRoot集合,在这个集合的在稍后的统一处理,

Free(S); //不在该集合且引用计数为0可以直接回收

}

PossibleRoot(S){

if (color(S)!= purple)

color(S)= purple

if (! buffered(S)){

buffered(S)= true

append S to Roots

}

}

第二部分

//主要是这个CollectCycles函数调用

//MarkRoot ScanRoots CollectRoots 来回收

CollectCycles(){

MarkRoot();

ScanToots();

ColletRoots();

}

//todo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值