一個PHP腳本。一般都不用考慮記憶體洩漏和垃圾回收的問題,因為腳本很快就執行完退出了,每個頁面處理結束,建立的simple_html_dom對象就會被銷毀。
但當運作時間長,資料量大的時候,程式運作一段時間後,PHP腳本就占用了過多記憶體,然後報錯:
PHP Fetal error:Allowed memory size of 1342117728 bytes exhausted
1
PHP垃圾回收機制
PHP5.3之前使用的垃圾回收機制是單純的“引用計數”,也就是每個記憶體對象都配置設定了一個計數器,當記憶體對象被變量引用時,計數器+1,當變量引用撤掉時,計數器-1,當計數器等于0時,表明記憶體對象沒有被使用,該記憶體對象則進行銷毀,垃圾回收完成。
“引用計數”存在問題是當兩個或多個對象互相引用形成環狀後,記憶體對象的計數器不會消減為0,這一組記憶體對象沒用時,不能進行回收,導緻記憶體洩漏。
從PHP5.3開始,使用了新的垃圾回收機制,在引用計數的基礎上,實作了複雜的算法,來檢測記憶體對象中引用環的存在,以避免記憶體洩漏。
1
2
3
記憶體洩漏執行個體
class A{
private $b;
function __construct()
{
$this->b = new B($this);
}
function __destruct()
{
// TODO: Implement __destruct() method.
echo "A destruct";
}
}class B {
private $a;
function __construct($a)
{
$this->a = $a;
}
function __destruct()
{
// TODO: Implement __destruct() method.
echo "B destruct";
}
}for ($i = 0;;$i++) {
$a = new A();
echo memory_get_usage()."\n";