node.js - node垃圾回收、內(nèi)存泄漏相關(guān)問題
問題描述
最近剛開始研究垃圾回收,在試著回答餓了么大前端里的node內(nèi)存釋放相關(guān)的問題時,遇到了一些疑問:
let arr = [];while(true) arr.push(1);
無限增加的數(shù)組,這肯定是會爆掉內(nèi)存的。
let arr = [];while(true) arr.push();
這個我覺得只是一直使用 arr ,導(dǎo)致 arr 不能被釋放吧?
let arr = [];while(true) arr.push(new Buffer(1000));
這個是因為 Buffer 的大小小于8k,會先檢查內(nèi)存池是否已滿,所以應(yīng)該不會爆掉內(nèi)存?
var theThing = null var replaceThing = function () { var originalThing = theThing var unused = function () { if (originalThing) console.log('hi') } theThing = { longStr: new Array(1000000).join(’*’), someMethod: function () { console.log(someMessage) } };};setInterval(replaceThing, 1000)
這個是因為 unused 對 originalThing 進行了引用,所以每一個 unused 都形成了一個 originalThing 的作用域 replaceThing 的閉包,這個閉包不會被回收掉,所以會在內(nèi)存中一直累積?
因為自己不是很確定,所以麻煩懂的小伙伴回答一下,謝謝!
問題解答
回答1:new Buffer估計不是簡單爆內(nèi)存的問題,Buffer是分配在V8堆外的,所以實際上比第一個的問題還要嚴重,我剛才就直接死機了。
第二個應(yīng)該說的是由于數(shù)組大小不會增長,所以不會爆內(nèi)存。
第三個原文中就有提及原因
比如上述情況中 unused 的函數(shù)中持有了 originalThing 的引用, 使得每次舊的對象不會釋放從而導(dǎo)致內(nèi)存泄漏
如果還是不理解可以看看原發(fā)現(xiàn)者的文章,里面講解的很詳細。
回答2:死循環(huán)的代碼到哪都會爆內(nèi)存,特別是js這種單線程語言,直接阻塞卡死。 Buffer類型我沒用過,會不會檢查內(nèi)存池這個無法確定,但卡死了檢不檢查內(nèi)存意義也不大。
最后一個我同意你的說法,每次循環(huán)都新建一個對象,theThing的引用地址不斷在變化,正常情況下舊的引用對象就應(yīng)該被垃圾回收了,但由于unused引用了舊的對象originalThing,originalThing又一個私有變量,所以舊的對象無法被垃圾回收,就造成了內(nèi)存泄露。
有沒有下面這段代碼的區(qū)別,環(huán)境chrome,運行30s。 第一幅圖是沒有這段代碼的結(jié)果,內(nèi)存在15M浮動。第二幅圖是有這段代碼的結(jié)果,內(nèi)存不斷增長。
function unused() { if (originalThing) console.log('hi');}


我也不是很確定,不過可以用memwatch-next的包看看
相關(guān)文章:
1. docker綁定了nginx端口 外部訪問不到2. dockerfile - 為什么docker容器啟動不了?3. git - webstorm窗口中左側(cè)列表的文件名顏色怎么修改4. javascript - 深夜被問題困擾求解惑,rn的API之PermissionsAndroidd的問題5. javascript - 最近用echarts做統(tǒng)計圖時遇到兩個問題!!6. android權(quán)限被第三方安全軟件禁止,如何獲取該權(quán)限狀態(tài)7. docker images顯示的鏡像過多,狗眼被亮瞎了,怎么辦?8. mysql - 我的myeclipse一直連顯示數(shù)據(jù)庫連接失敗,不知道為什么9. tp 6.0 數(shù)據(jù)查詢,求教!10. mysqld無法關(guān)閉

網(wǎng)公網(wǎng)安備