有時候用php在處理比較大的資料的時候,會報記憶體不夠的錯誤。
想到執行個體化可能會佔據記憶體,unset掉之後並沒有改善多少,那麼php中執行個體化的對象會在什麼時候被釋放?
回複內容:
有時候用php在處理比較大的資料的時候,會報記憶體不夠的錯誤。
想到執行個體化可能會佔據記憶體,unset掉之後並沒有改善多少,那麼php中執行個體化的對象會在什麼時候被釋放?
php是有記憶體回收(Garbage Collection)機制的。具體可以查閱文檔:http://php.net/manual/zh/features.gc.php
記憶體回收機制就是最早在Lisp中被提出,關於更多記憶體回收的資訊.
參見維基百科:http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
這種時候你就應該考慮你處理資料的演算法和機制了, 你說執行個體化會佔用記憶體, 那你是不是在這個大資料裡經常執行個體化對象呢, 既然是大資料, 你還在裡面一直執行個體化,好像就不太合適了。
另外, unset銷毀的只是該對象, 並沒有銷毀該對象在記憶體中的佔用, 這裡引用一句話:
當給一個變數賦值(或者相類似的操作),記憶體會開闢一個空間儲存,這時候會產生兩個重要的概念,一個是“記憶體的地址”,一個是“地址內的內容”。unset打斷了變數與地址間的聯絡。而php會自動檢測記憶體位址裡的資料是否完全沒有跟其它變數產生聯絡,在確定沒有的情況下會回收記憶體。所以要回收記憶體,那就要把所有的聯絡打斷。
參考文章
unset函數記憶體配置和銷毀問題探秘
php unset對象執行個體
php原來是通過引用計數器來實現記憶體回收,也就是是多個php變數可能會引用同一份記憶體,這種情況unset掉其中一個是不會釋放記憶體的;
例如:
$a = 1; $b = $a; unset($a);
另外,離開了變數的範圍後變數所佔用的記憶體就會被自動清理(不包含靜態變數),如函數或方法內的局部變數,對這些局部變數進行unset在函數外來看記憶體也是沒有減少的。
最後,引用計數有個缺陷,就是當循環參考出現時,計數器沒法清0,記憶體佔用會持續到頁面訪問結束。對於這個問題PHP5.3中增加了記憶體回收機制。嗯,就是1樓提到的