當前位置:網站首頁>PHP垃圾回收機制

PHP垃圾回收機制

2022-01-27 19:19:57 進擊的架構獅

垃圾回收,簡稱gc。顧名思義,就是廢物重利用的意思。再說這個之前先接觸一下內存泄露,大概意思就是申請了一塊地兒拉了會兒屎,拉完後不收拾,那麼那塊兒地就算是糟蹋了,地越用越少,最後一地全是屎。說到底一句,用了記得還。一定程度上說,垃圾回收機制就是用來擦屁股的。
如果用過C語言,那麼申請內存的方式是malloc或者是calloc,然後你用完這個內存後,一定不要忘了用free函數去釋放掉,這就是傳說中手動垃圾回收,一般都是掃地神僧用這種方式。很多高層次語言中,你這輩子都是接觸不到內存管理的,比如世界上最好的語言php,這種語言替你管理了內存,你就安安心心寫爛代碼即可。寫php的,你說你關心內存,我是不怎麼相信的,一定是你在裝逼。當然了,如果你用的swoole或者wm或者自己發明的常駐內存級php應用,那你將不得不關注內存泄露問題,也就說一定要記得釋放無用變量。那麼,在用的最普遍地最傳統的web開發中,php的自動垃圾回收機制是怎樣的呢?這個問題我們先這麼想,就是都知道php是C語言實現的,現在把C語言給你放在這裏了,然後你想想如何用C語言實現對一個變量的統計以及釋放。你不要想如何實現php,你就想C語言如何實現一個變量,從聲明開始到最後沒人用了,就把這個變量所占的內存給釋放掉。你從這個角度出發,就會舒服一些,這不再是一個技術難題,而是一個傻逼產品經理提的一個傻逼需求。好了,步入正題,PHP進行內存管理的核心算法一共兩項:一是引用計數,二是寫時拷貝,請理(bei)解(song)。

算法原理:引用計數和寫時拷貝

引用計數:賦值時refcount + 1,引用時recount+1和is_ref變成true
寫時拷貝:當賦值的變量變化或者寫入新值,都會拷貝一份數據結構

unset

unset 銷毀的是指向對象的變量,而不是這個對象。PHP 垃圾回收機制(Garbage Collector 簡稱GC) 在PHP中,沒有任何變量指向這個對象時,這個對象就成為垃圾。

新的垃圾回收機制

php5.3版本之後引入根緩沖機制,即php啟動時默認設置指定zval數量的根緩沖區(默認是10000),當php發現有存在循環引用的zval時,就會把其投入到根緩沖區,當根緩沖區達到配置文件中的指定數量(默認是10000)後,就會進行垃圾回收,以此解决循環引用導致的內存泄漏問題

確認為垃圾的准則

1、如果引用計數减少到零,所在變量容器將被清除(free),不屬於垃圾
2、如果一個zval 的引用計數减少後還大於0,那麼它會進入垃圾周期。其次,在一個垃圾周期中,通過檢查引用計數是否减1,並且檢查哪些變量容器的引用次數是零,來發現哪部分是垃圾。

心得

大多數情况下,面試官問你問題主要是想一是要你個思維思路,二是看你學習程度。就像gc這個問題,其實很多脚本語言的垃圾回收機制基本上都是靠引用計數和寫時拷貝這兩種算法結合完成的,所以如果你設計一門脚本語言,gc機制就按照這兩種算法進行設計即可。其次是大多數phper不會看這些東西的,面試官問你這個問題不是要你死記硬背那麼多細節,你背不過的,他還是想探測你平時有沒有更積極地往深層發展的心態。

鏈接

https://segmentfault.com/a/1190000018369789
https://www.cnblogs.com/xuxubaobao/p/10840176.html

版權聲明
本文為[進擊的架構獅]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201271919574120.html