首頁  >  文章  >  後端開發  >  PHP核心-記憶體洩漏與新垃圾回收機制的圖文介紹

PHP核心-記憶體洩漏與新垃圾回收機制的圖文介紹

黄舟
黄舟原創
2017-03-09 09:51:581978瀏覽

垃圾回收機制是一種動態儲存分配方案。它會自動釋放程式不再需要的已分配的記憶體區塊。 自動回收記憶體的過程叫垃圾收集。 垃圾回收機制可以讓程式設計師不必過度關心程式記憶體分配,從而將更多的精力投入到業務邏輯。

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) bytes exhausted (tried #738218371 bytes)by#1281MB =78121MB = 12121MB = 12121MB


以上是PHP核心-記憶體洩漏與新垃圾回收機制的圖文介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn