### php5.3之前版本的垃圾回收機制
1. 當變量被引用時,refcount計數器+1
2. 當unset($a)或出現寫時復制操作后,refcount計數器-1
3. php會根據refcount的值來判斷是不是垃圾,如果refcount值減為0,php會將該zval容器當做垃圾釋放掉。但是循環應用的變量無法回收(一般循環引用的變量出現在數組或者對象上)
### php5.3之后版本的垃圾回收機制
1. 如果refcount減少后大于0,會把這個變量放入緩沖buffer中,等緩沖buffer滿了之后,在統一進行處理。
2. 一個變量只能加入buffer一次,為了防止重復加入,變量在加入后會把zend_refcound_h.gc_info設置為紫色,下次refcount減少時如果發現已經加入過了則不再重復插入。
3. buffer緩沖區是一個雙向鏈表,等到緩沖區滿了以后則啟動垃圾檢查過程。
4. 垃圾檢查過程:
(1). 遍歷緩沖區,再對當前變量的所有成員進行遍歷,
(2). 把當前變量的所有成員的refcount減1.
(3). 最后檢查當前變量的應用,如果減為0,則為垃圾。
**注:算法思路,垃圾時由于變量中的成員引用自身導致的,那么就對變量所有成員減1,結果發現變量本身refcount變為0則就表明其引用全部來自自生成員。**
5. 垃圾檢查具體實現:
(1). 遍歷buffer緩沖,將當前value標為灰色,然后對當前value的成員進行深度遍歷,把成員value的refcount減1,并且也標為灰色。
(2). 再重復遍歷buffer緩沖,檢查當前value的refcount是否為0.如果為0表示確實時垃圾,則標為白色。如果不為0則排除了引用全部來自自身的可能,表示還有外部的引用,并不是垃圾。這時將不為0的成員refcount+1,并標為黑色。
(3). 再次遍歷buffer緩沖,將非白色的變量刪除,最終buffer緩沖中剩下的全部為真正的垃圾,并清除這些垃圾。
- linux 基礎
- ln 鏈接
- linux 環境變量
- linux 進程查看
- nginx
- redis
- redis 安裝
- php 底層原理
- php源碼編譯安裝
- phpize文件
- php命令行
- php7 新特性
- php7 變量
- php7 生命周期
- php sapi運行模式
- php 內存管理
- php 運行機制和Zend虛擬機
- php垃圾回收
- php 基礎
- php.ini
- php函數
- 面向對象
- php 文件上傳
- ob緩沖和頁面靜態化
- php中的session
- php cURL擴展
- composer 應用
- php 錯誤和異常
- thinkphp
- tp6容器和依賴注入
- tp6 的服務
- tp6事件
- tp6 多應用
- tp6路由
- tp6 cache
- tp6 request
- tp6 中間件
- tp6 response
- tp6 Db
- 備忘錄
- 數據庫表