- 系 統(tǒng)
- 進階教程
- 微軟認證
- Win7/WinX
- 優(yōu)化
- 系統(tǒng)故障
- Windows NT
- 社區(qū)
垃圾回收 各結構體頭部的gc提供對垃圾回收的支持。 垃圾回收是一種自動的內存管理機制,當一個變量在內存中不再被需要時,應該予以釋放,這種內存資源管理稱為垃圾回收。 其中一種垃圾回收的方法是引用計數(shù),通過對數(shù)據(jù)存儲的物理空間多附加一個計數(shù)器空間,當其他數(shù)據(jù)與其相關時,計數(shù)器加一,反之,相關解除時計數(shù)器減一,定期檢查各存儲對象的計數(shù)器,計數(shù)器為零的話,則認為該對象已經(jīng)被拋棄而應將其所占物理空間回收。 PHP 7 中垃圾回收的實現(xiàn)方法是定期遍歷和標記若干存儲對象的數(shù)組,再通過算法將是垃圾的物理空間回收。
3.4.1 gc的基本結構 zend_refcounted是由uint32_t的refcount和uint32_t的type_info組成,總大小為8字節(jié)。 type_info(4字節(jié)) type:記錄當前元素的類型 flags:標記數(shù)據(jù)類型 gc_info:當前元素的顏色和垃圾回收池中的位置,高地址的兩位用來標記顏色
3.4.2 引用計數(shù) 3.4.3 循環(huán)引用問題 在PHP中使用&會改變等號兩邊zval的類型(改變?yōu)镮S_REFERENCE),引用計數(shù)記錄在新的結構體(zend_reference)中,并且引用計數(shù)為2. 3.4.4 垃圾回收 PHP垃圾回收包含兩部分,垃圾收集器和垃圾回收算法。垃圾收集器是將可能是垃圾的元素收集在回收池中,然后由垃圾回收算法回收。 PHP7垃圾回收維護了一個全局變量gc_globals的HashTable。 向操作系統(tǒng)申請10001個gc_root_buffer結構體大小的內存,然后將GC_G(buf指向首地址),GC_G(last_unused)指向尾地址。 垃圾收集過程: 要求數(shù)據(jù)類型是數(shù)組或對象 沒有在緩沖區(qū)中存在過 沒有被標記過 將其gc_info標記為紫色,且記錄在緩沖區(qū)的位置 當緩沖區(qū)滿了,再收集新的元素就會觸發(fā)垃圾回收算法,引用計數(shù)大于 0 說明它還在其他地方使用,那么先將元素的引用計數(shù)減 1,如果發(fā)現(xiàn)引用計數(shù)為 0,則說明任何地方都不再使用它,那么它就是垃圾,需要被回收掉,反之說明不是垃圾,需要將其從回收池移出去。而垃圾回收算法也是圍繞這個核心條件進行的。 垃圾回收過程:
|