mozilla开源—cycle collecter
circle collection 是mozilla项目中用来解决cycle-ownership leak。
先说说cycle-ownership leak(不知道中文应该怎么翻译)。假如有A、B、C三个类。
cycle-ownership leak
class A : public IA{
public:
//construction, destruction, some function
private:
COMPtr<C> m_c;
};
class B : public IB{
public:
//contruction, desctruction, somefunction
private:
COMPtr<A> m_a;
};
class C : public IC;
{
public:
//contruction, desctruction, somefunction
private:
COMPtr<B> m_b;
}
当我们实例A, B, C。
COMPtr<A> a = new A;
COMPtr<B> b = new B(a);
COMPtr<C> c = new C(b):
a->setMemberC(c);
在正常情况下,当三个类的生命周期结束时,a, b, c三个实例将会调用COMPtr的析构函数,减少引用计数器。如果没有a->setMemberC(c)这条语句。a的引用计数为2,b的引用计数器为2, c的引用计数器为1。
那么被删除的顺序将是.
1. COMPtr<C>析构函数减少c的引用计数器,这时COMPtr<C>实例的引用计数器为0。所以C实例将被delete。
2. C被delete时,将减少对成员B的引用。COMPtr<B>的引用计数器变为1。
3. COMPtr<B>实例的析构函数被调用, b的引用计数器再减1,最后变为0,所以B实例也将在这里被delete;
4. B被delete时,将减少对成员A的引用。COMPtr<A>的引用计数器变为1.
5. COMPtr<A>实例析构函数被调用,COMPtr<A>的引用计数器为0.实例A被删除。
这里所有new出来的实例都被成功删除。但是如果有最后一行代码。将不同。a的引用计数器变为2,b的引用计数器变为2,c的引用计数器为2。当类的生命周期结束时,析构函数调用是如下的。
1. COMPtr<C>析构函数减少c的引用计数器,这时COMPtr<C>实例的引用计数器为1。所以C实例将不被delete。
2. C不被delete时,将不减少对成员B的引用。COMPtr<B>的引用计数器还是2。
3. COMPtr<B>实例的析构函数被调用, b的引用计数器再减1,最后变为1,所以B实例也将不会被delete;
4. B不被delete,所以对成员A的引用也不会被调用。COMPtr<A>的引用计数器变为2.
5. COMPtr<A>实例析构函数被调用,COMPtr<A>的引用计数器为1.实例A被不会删除。
这里三个new 出来的实例都没有被删除,而是形成一个循环。a->c, c->b, b->a。所以这里导致内存泄漏。这就是cycle-ownership leak.
循环收集器(cycle collecter)
收集器(cycle collecter)过程主要分为三个步骤
1. 空闲期:积累有可能与垃圾循环(garbage cycle)的XPCOM指针。这步骤占收集器运行时间的太部分。
2. 扫描期:收集器周期性的被唤醒检查认缓冲区中的任何可疑的XPCOM指针。这时,收集器重复的访问每一个候选者的循环收集帮助类。如果这个类存在,收集器就让帮助类描述候选者的成员。通过这种方法收集器建立一个从可疑的对象开始延伸的拥有关系子图。
3. 分离期:如果收集器找一组对象全部引用到另一个对象的这样一个组,并对象的引用计数器全部等于这个组中的内存指针, 这样收集器认为这是一个循环垃圾(If the collector finds a group of objects that all refer back to one another, and establishes that the objects' reference counts are all accounted for by internal pointers within the group, it considers that group cyclical garbage不知道怎么翻译.),收集器走访所有它发现的垃圾类。再次咨询他们的帮助类,请求帮助类分离每一个直接成员(immediate children)
reference:
https://developer.mozilla.org/en/Interfacing_with_the_XPCOM_cycle_collector

浙公网安备 33010602011771号