1 2 3 4 5 6 7 8 9 10 11 | Set black,grey,black,roots;
black = {};
grey = referenced(roots);
white = {all};
while ( grey is not empty ) {
object in grey;
move(object,black);
move(referenced(object),grey);
}
Set unreachable = white;
|
这种回收机制会在每个对象中保留一个bit为来标示该对象属于white集合或者black集合,而grey集合则单独用一个list来维护。在遍历整个对象引用树时,这个bit标记了对象的状态。这种策略的好处是不占用太多内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int black = 0,white = 1;
/*mark phase*/
List grey_set = referenced(roots);
while ( grey_set is not empty ) {
Object o = grey_set.get();
mark(o,black);
mark(referenced(object),grey);
}
/*sweep*/
for(Object o in object_list) {
if(o is white){
sweep(o);
}
}
|
这种机制与mark and sweep存在两个最大的不同点 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | int black = 0,white = 1;
Object new = NULL;
/*mark phase*/
if(no white object)/*no memory*/{
List grey_set = referenced(roots);
black = !black;
white = !white;
while ( grey_set is not empty ) {
Object o = grey_set.get();
mark(o,black);
mark(referenced(o),grey);
}
/*unreachable/unused = white object;*/
new = find_one_white();
mark(new,black);
}
else{
/*allocated white object to new one*/
new = find_one_white();
mark(new,black);
}
/*no sweep phase*/
|