第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

nodejs 內(nèi)存泄露問題?

nodejs 內(nèi)存泄露問題?

BIG陽 2018-11-05 15:13:19
var theThing = nullvar 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, 1);`描述問題:這是nodejs中一個典型的垃圾回收案例,上面那段代碼運行之后會帶來非常明顯的內(nèi)存泄露情況,問題在于這段代碼并沒有形成閉包,為什么堆內(nèi)的對象沒有被立即釋放?原文中的一個解釋是unused函數(shù)內(nèi)部引用了originalThing,但是函數(shù)運行之后,申請的內(nèi)存就會被釋放,原本指向unused的函數(shù)的指針也就沒有了,所以unused函數(shù)在堆中也應該會被回收,對originalThing的引用也就不存在了,那么怎么會引起內(nèi)存泄露呢?
查看完整描述

1 回答

?
達令說

TA貢獻1821條經(jīng)驗 獲得超6個贊

這段代碼做了一件事:每次調(diào)用 replaceThing 時,theThing 都會得到新的包含一個大數(shù)組和新的閉包(someMethod)的對象。同時,沒有用到的那個變量持有一個引用了 originalThing(replaceThing 調(diào)用之前的 theThing)閉包。關鍵的問題是每當在同一個父作用域下創(chuàng)建閉包作用域的時候,這個作用域是被共享的。在這種情況下,someMethod 的閉包作用域和 unused 的作用域是共享的。unused 持有一個 originalThing 的引用。盡管 unused 從來沒有被使用過,someMethod 可以在 theThing 之外被訪問。而且 someMethod 和 unused 共享了閉包作用域,即便 unused 從來都沒有被使用過,它對 originalThing 的引用還是強制它保持活躍狀態(tài)(阻止它被回收)。當這段代碼重復運行時,將可以觀察到內(nèi)存消耗穩(wěn)定地上漲,并且不會因為 GC 的存在而下降。本質(zhì)上來講,創(chuàng)建了一個閉包鏈表(根節(jié)點是 theThing 形式的變量),而且每個閉包作用域都持有一個對大數(shù)組的間接引用,這導致了一個巨大的內(nèi)存泄露。


查看完整回答
反對 回復 2018-12-08
  • 1 回答
  • 0 關注
  • 416 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號