PHP的GC機制

就是垃圾回收器,全稱Garbage Collection。

  1. php中垃圾是如何定義的?
    準確地說,判斷是否爲垃圾,主要看有沒有變量名指向變量容器zval,如果沒有則認爲是垃圾,需要釋放。

  2. 5.3版本以後php是如何處理垃圾內存的?
    判斷處理過程
    .如果一個zval的refcount增加,那麼此zval還在使用,不屬於垃圾
    .如果一個zval的refcount減少到0, 那麼zval可以被釋放掉,不屬於垃圾
    .如果一個zval的refcount減少之後大於0,那麼此zval還不能被釋放,此zval可能成爲一個垃圾
    就是對此zval中的每個元素進行一次refcount減1操作,操作完成之後,如果zval的refcount=0,那麼這個zval就是一個垃圾

  3. 對於一個包含環形引用的數組,對數組中包含的每個元素的zval進行減1操作,之後如果發現數組自身的zval的refcount變成了0,那麼可以判斷這個數組是一個垃圾

  4. 優化配置:會有一個緩衝區的概念,等緩衝區滿了纔會一次性去給清掉。緩衝區默認可以放10,000個節點,當緩衝區滿了纔會清理。

  5. php.ini中設置 zend.enable_gc 項來開啓或則關閉GC。gc_enable() : 開啓GC gc_disable() : 關閉GC
    gc_collect_cycles() : 在節點緩衝區未滿的情況下強制執行垃圾分析算法

  6. 涉及到垃圾回收的知識點
    .unset只是斷開一個變量到一塊內存區域的連接,同時將該內存區域的引用計數-1;內存是否回收主要還是看refount是否到0了,以及gc算法判斷
    .a=null是直接將a 指向的數據結構置空,同時將其引用計數歸0
    .腳本執行結束,該腳本中使用的所有內存都會被釋放,不論是否有引用環
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章