2016-11-06 52 views
5

如果我有以下代碼:是否有必要使垃圾收集的原始值無效?

function MyClass() { 
    this.data = { 
     // lots of data 
    }; 
} 

var myClassInstace = new MyClass(); 

var myobj = { 
    num:123, 
    str:"hello", 
    theClass:myClassInstance 
}; 

我知道這是絕對必要的事情:

myobj.theClass = null; 

要釋放myClassInstance及其data財產GC。但是,我應該怎麼處理myobj.nummyobj.str?我是否也必須給他們價值null?他們原始的事實是否改變了有關GC的任何事情?

+0

你想保留'myobj'但要確保其所有值不佔用內存或者你想完全從記憶抹'myobjt'? – vlaz

+0

「我知道這是絕對必要的事:'myobj.theClass = NULL;'...」 **不,這不是** –

+0

是的,我要刮淨'myobj'。如果我想要**那**,我非常肯定,如果我不想導致內存泄漏,那麼必須執行'myobj.theClass = null'。 –

回答

3

實現垃圾收集將能夠儘快值不再從代碼可達收集項目的JavaScript運行。這對於對象引用以及基元都是如此。收集項目的確切時間的細節因實現而異,但甚至沒有必要將對象引用設置爲null(如您所述),除非您需要早於當前函數的自然終止清理對象。

這一切都關係到的「範圍」和作用域鏈的基本概念。當物品不再處於任何其他物體範圍鏈中時,可以收集物品。清楚地理解這個問題將回答這個問題,也有助於理解閉包,這些情況是物品在內存中的停留時間比您預期的要長。

+1

說Javascript使用引用計數是不正確的。首先,JavaScript是一種語言,而不是實現。不同的實現可能使用不同類型的垃圾收集。其次,V8至少不使用引用計數,它使用具有標記和掃描算法的分代收集器。 http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection –

+0

@JustinBlank更新了我的答案。 –

+0

很酷。這是一個很好的答案。 –

0

設置爲undefined(NOT NULL)將工作然而delete是更好的例子delete myobj.theClass

只是爲了避免誤解,我會說,有沒有辦法真正從內存在JavaScript中刪除的對象。你刪除它的引用或將它們設置爲undefined,以便GC可以完成它的工作並真正刪除。

+0

@Karpak U不理解問題而不是答案, –

1

有很多的「這取決於在這裏」,從你的代碼是做給你在運行的瀏覽器。但是,如果你的目標是JIT編譯沒有使用地圖爲它的屬性,那麼數字應該是一個8字節的double內聯存儲在對象內部。否定它將無能爲力。

字符串和myclass實例將是一個指向分配給對象之外的內存的指針(因爲一個字符串可以是任意多個字節,它不能存儲在對象中,編譯器可能會存儲一個字符串實例在內存中並且從不釋放它)。將它們刪除可以允許垃圾收集器在主對象超出作用域之前釋放它們。

然而,真正的問題是,爲什麼你擔心這一點。除非您已將代碼進行概要分析並將垃圾收集或內存泄漏確定爲問題,否則您不應嘗試優化GC行爲。特別是,除非你的對象本身長期存在,否則你不應該擔心置零字段。 GC在超出範圍時將收集它。