可能根缓冲区(possible roots):
存放垃圾回收期间遍历的变量
添加到跟缓冲区的时机:
当ZEND_UNSET_VAR发生或zend_assign_to_variable仅在可能产生垃圾节点时调用时,可以将节点添加到所有根。将调用gc_possible le_root()将节点添加到可能的根。
变量在缓冲区的状态:
* BLACK (GC_BLACK) - 正在使用或者空闲
* GREY (GC_GREY) - 周期的可能成员(疑似垃圾)
* WHITE (GC_WHITE) -周期的垃圾成员
* PURPLE (GC_PURPLE) - 周期的可能根(就是变量)
//源码的原文 /** * zend_gc_collect_cycles * ====================== * * Colors and its meaning * ---------------------- * * BLACK (GC_BLACK) - In use or free. * GREY (GC_GREY) - Possible member of cycle. * WHITE (GC_WHITE) - Member of garbage cycle. * PURPLE (GC_PURPLE) - Possible root of cycle. * * Colors described in the paper but not used * ------------------------------------------ * * GREEN - Acyclic * RED - Candidate cycle underogin * ORANGE - Candidate cycle awaiting epoch boundary. * * * Flow * ===== * * The garbage collect cycle starts from 'gc_mark_roots', which traverses the * possible roots, and calls mark_grey for roots are marked purple with * depth-first traverse. * * After all possible roots are traversed and marked, * gc_scan_roots will be called, and each root will be called with * gc_scan(root->ref) * * gc_scan checkes the colors of possible members. * * If the node is marked as grey and the refcount > 0 * gc_scan_black will be called on that node to scan it's subgraph. * otherwise (refcount == 0), it marks the node white. * * A node MAY be added to possbile roots when ZEND_UNSET_VAR happens or * zend_assign_to_variable is called only when possible garbage node is * produced. * gc_possible_root() will be called to add the nodes to possible roots. * * * For objects, we call their get_gc handler (by default 'zend_std_get_gc') to * get the object properties to scan. * * * @see http://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf */