簡體   English   中英

Javascript /垃圾收集器中的循環引用

[英]Circular references in Javascript / Garbage collector

有人可以詳細解釋Javascript引擎如何處理循環引用? 瀏覽器甚至node.js之間有很大的區別嗎?

我所說的是對象內部的顯式反向/下一個引用。 例如:

var objA = {
    prop: "foo",
    next: null
};

var objB = {
    prop: "foo",
    prev: null
};

objA.next = objB;
objB.prev = objA;

我們走了。 如果我們執行console.log( objA )我們可以看到我們創建了一個無限鏈。 最大的問題是,這是不是很糟糕? 未明確清除時是否會造成內存泄漏?

所以我們必須這樣做

objA.next = null;
objB.prev = null;

或者垃圾收集者會照顧我們這樣的星座嗎?

任何半體面的垃圾收集器都會處理周期。

如果你進行天真的引用計數,周期只是一個問題。

大多數垃圾收集器不進行重新計數(因為它無法處理循環,因為它效率低)。 相反,他們只是遵循他們可以找到的每個引用,從“根”(通常是全局變量和基於堆棧的變量)開始,並將他們可以找到的所有內容標記為“可達”。

然后他們只是回收所有其他記憶。

循環沒有問題,因為它們只是意味着將多次到達同一節點。 在第一次之后,節點將被標記為“可達”,因此GC將知道它已經存在,並跳過該節點。

基於引用計數的更原始的GC通常實現用於檢測和中斷循環的算法。

簡而言之,這不是你必須擔心的事情。 我似乎記得IE6的Javascript GC實際上無法處理循環(我可能錯了,自從我讀它以來已經有一段時間了,而且自從我觸及IE6以來已經有很長時間了),但在任何現代實現中,它都不是問題。

垃圾收集器中的重點是抽象出內存管理。 如果您必須自己完成這項工作,那么您的GC就會崩潰。

有關現代垃圾收集和使用的標記和掃描算法的更多信息,請參閱MDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM