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)存泄露。
添加回答
舉報