PHP核心--記憶體流失與新記憶體回收機制____PHP
來源:互聯網
上載者:User
記憶體回收機制是一種動態儲存裝置分配方案。它會自動釋放程式不再需要的已指派的記憶體塊。 自動回收記憶體的過程叫垃圾收集。 記憶體回收機制可以讓程式員不必過分關心程式記憶體配置,從而將更多的精力投入到商務邏輯。 PHP也在語言層實現了記憶體的動態管理,這在前面的章節中已經有了詳細的說明, 記憶體的動態管理將開發人員從繁瑣的記憶體管理中解救出來。與此配套,PHP也提供了語言層的記憶體回收機制, 讓程式員不必過分關心程式記憶體配置。 在PHP5.3版本之前, PHP只有簡單的基於引用計數的記憶體回收,當一個變數的引用計數變為0時, PHP將在記憶體中銷毀這個變數,只是這裡的垃圾並不能稱之為垃圾。 並且PHP在一個生命週期結束後就會釋放此進程/線程所佔的內容,這種方式決定了PHP在前期不需要過多考慮記憶體的泄露問題。 但是隨著PHP的發展,PHP開發人員的增加以及其所承載的業務範圍的擴大。 在PHP5.3中引入了更加完善的記憶體回收機制。 新的記憶體回收機制解決了無法處理迴圈的引用記憶體流失問題。下邊,我們將配合執行個體測試資料,探討一下新的記憶體回收機制。
(tips: refcount和zval是什麼。 每個變數在PHP底層都是一個zval的結構體中儲存,相同值得變數共用一個值,用refcount來儲存指向這個值得變數個數, 比如$a=$b=1,則他們指向一個zval,值為1,refount=2 ,表示有兩個變數指向了它,詳細瞭解見 PHP核心的儲存機制(分離/改變) ) 阿
下邊是實際資料的一個測試,結論在右下角:
如何避免記憶體泄露: 1. 寫高品質代碼,減少記憶體流失的可能 2.根據PHP生命週期回收,讓系統自動回收記憶體(對於非常駐行程式有效,RINIT ,RSHOTDOWN) 3.手動回收,即重啟伺服器nginx或apache (MINIT ,MSHOTDOWN) 4.調高php.ini設定檔: php.ini memory_limit = 128M(不推薦) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 38218371 bytes) 128MB = 134217728byte