php中執行個體化的對象什麼時候會釋放

來源:互聯網
上載者:User
有時候用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樓提到的

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.