垃圾回收機制是一種動態存儲分配方案。它會自動釋放程序不再需要的已分配的內存塊。自動回收內存的過程叫垃圾收集。垃圾回收機制可以讓程序員不必過分關心程序內存分配,從而將更多的精力投入到業務邏輯。在現在的流行各種語言當中,垃圾回收機制是新一代語言所共有的特征,如Python、PHP、Eiffel、C#、Ruby等都使用了垃圾回收機制。雖然垃圾回收是現在比較流行的做法,但是它的年紀已經不小了。早在20世紀60年代MIT開發的Lisp系統中就已經有了它的身影,但是由于當時技術條件不成熟,從而使得垃圾回收機制成了一個看起來很美的技術,直到20世紀90年代Java的出現,垃圾回收機制才被廣泛應用。
PHP也在語言層實現了內存的動態管理,這在前面的章節中已經有了詳細的說明,內存的動態管理將開發人員從繁瑣的內存管理中解救出來。與此配套,PHP也提供了語言層的垃圾回收機制,讓程序員不必過分關心程序內存分配。
在PHP5.3版本之前,PHP只有簡單的基于引用計數的垃圾回收,當一個變量的[引用計數](http://docs.php.net/manual/zh/features.gc.refcounting-basics.php)變為0時,PHP將在內存中銷毀這個變量,只是這里的垃圾并不能稱之為垃圾。并且PHP在一個生命周期結束后就會釋放此進程/線程所點的內容,這種方式決定了PHP在前期不需要過多考慮內存的泄露問題。但是隨著PHP的發展,PHP開發者的增加以及其所承載的業務范圍的擴大,在PHP5.3中引入了更加完善的垃圾回收機制。新的垃圾回收機制解決了無法處理循環的引用內存泄漏問題。PHP5.3中的垃圾回收機制使用了文章[引用計數系統中的同步周期回收(Concurrent Cycle Collection in Reference Counted Systems)](http://www.research.ibm.com/people/d/dfb/papers/Bacon01Concurrent.pdf)中的同步算法。關于這個算法的介紹我們就不再贅述,在PHP的官方文檔有圖文并茂的介紹:[回收周期(Collecting Cycles)](http://docs.php.net/manual/zh/features.gc.collecting-cycles.php)。
在本小節,我們從PHP的垃圾回收機制的結構出發,結合其算法介紹PHP5.3垃圾回收機制的實現。
- 第一章 準備工作和背景知識
- 第一節 環境搭建
- 第二節 源碼結構、閱讀代碼方法
- 第三節 常用代碼
- 第四節 小結
- 第二章 用戶代碼的執行
- 第一節 生命周期和Zend引擎
- 第二節 SAPI概述
- Apache模塊
- 嵌入式
- FastCGI
- 第三節 PHP腳本的執行
- 詞法分析和語法分析
- opcode
- opcode處理函數查找
- 第四節 小結
- 第三章 變量及數據類型
- 第一節 變量的結構和類型
- 哈希表(HashTable)
- PHP的哈希表實現
- 鏈表簡介
- 第二節 常量
- 第三節 預定義變量
- 第四節 靜態變量
- 第五節 類型提示的實現
- 第六節 變量的生命周期
- 變量的賦值和銷毀
- 變量的作用域
- global語句
- 第七節 數據類型轉換
- 第八節 小結
- 第四章 函數的實現
- 第一節 函數的內部結構
- 函數的內部結構
- 函數間的轉換
- 第二節 函數的定義,傳參及返回值
- 函數的定義
- 函數的參數
- 函數的返回值
- 第三節 函數的調用和執行
- 第四節 匿名函數及閉包
- 第五節 小結
- 第五章 類和面向對象
- 第一節 類的結構和實現
- 第二節 類的成員變量及方法
- 第三節 訪問控制的實現
- 第四節 類的繼承,多態及抽象類
- 第五節 魔術方法,延遲綁定及靜態成員
- 第六節 PHP保留類及特殊類
- 第七節 對象
- 第八節 命名空間
- 第九節 標準類
- 第十節 小結
- 第六章 內存管理
- 第一節 內存管理概述
- 第二節 PHP中的內存管理
- 第三節 內存使用:申請和銷毀
- 第四節 垃圾回收
- 新的垃圾回收
- 第五節 內存管理中的緩存
- 第六節 寫時復制(Copy On Write)
- 第七節 內存泄漏
- 第八節 小結
- 第七章 Zend虛擬機
- 第一節 Zend虛擬機概述
- 第二節 語法的實現
- 詞法解析
- 語法分析
- 實現自己的語法
- 第三節 中間代碼的執行
- 第四節 PHP代碼的加密解密
- 第五節 小結
- 第八章 線程安全
- 第二節 線程,進程和并發
- 第三節 PHP中的線程安全
- 第九章 錯誤和異常處理
- 第十章 輸出緩沖
- 第十六章 PHP語言特性的實現
- 第一節 循環語句
- foreach的實現
- 第二十章 怎么樣系列(how to)
- 附錄
- 附錄A PHP及Zend API
- 附錄B PHP的歷史
- 附錄C VLD擴展使用指南
- 附錄D 怎樣為PHP貢獻
- 附錄E phpt測試文件說明
- 附錄F PHP5.4新功能升級解析
- 附錄G:re2c中文手冊