簡體   English   中英

如何在JavaScript中觸發垃圾回收?

[英]How is garbage collection triggered in JavaScript?

考慮下面的JavaScript代碼。 我正在創建由4個元素組成的數組,然后立即刪除對其的引用。 什么時候進行垃圾收集? 我知道它特定於語言實現,但是我們沒有那么多JavaScript引擎。

編輯:這是最簡單的情況,但我很感興趣,因為垃圾回收在某些Web音頻應用程序中會引起可聞的故障。

var a = [1, 2, 3, 4];
a = null;
// other code

更新: Javascript和垃圾收集不解釋事件的順序及其觸發方式。 我不想控制垃圾收集。 我需要更好的理解來設計更好的代碼。

這是刪除不再使用的對象的引用的好方法。 許多(幾乎所有)javascript引擎都使用標記和掃描方法。 如果要刪除對某個對象的引用,並且該對象沒有其他引用,則可能會在下一個“標記和掃描周期”中收集該對象。

垃圾收集是一種循環方法,在少數發動機中會定期發生。 一些引擎表示他們以有效的方式進行GC,但是沒有有效的文檔。

可以通過多種方式觸發GC

  • 觸發分配:分配緩沖區/年輕人生成/調用中不再有空間,需要GC釋放對象
    在混合GC /手動分配環境中,這變得更加復雜。 由於javascript可以保留手動分配的資源,因此malloc包裝器也可能需要觸發GC。
  • [在瀏覽器中]當選項卡/窗口被關閉/替換時(假定當時有很多易於收集的垃圾)
  • 通過啟發式方法在時間上觸發增量集合以滿足暫停時間目標
  • 特權javascript可能能夠直接觸發集合
  • 如果各種非GC管理的組件用盡了本機資源(文件句柄,虛擬地址空間),這是最后的努力,希望這些GC對象等待最終確定

我目前可能還想到其他原因。 通常,您不應該擔心自己。

如果要保持較低的GC,則需要保持較低的對象分配率。 例如,某些算法可以從在其上執行工作的預分配緩沖區中受益。 該策略的有效性取決於javascript運行時是否進行轉義分析,以及它在避免短命分配方面的有效性。 以及收集者是否世代相傳。 一代代的收藏家遭受快速,短暫的分配的痛苦要小得多。

暫無
暫無

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

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