我正在學習Javascript,並且在各種文本中,作者將使用標記和掃描gc從內存中釋放對象來說javascript。他們會也說到如何設置值的變量引用爲null它將刪除對該值的引用,允許爲gc設置分配的空間。 This SO answer表示可以通過將變量包含的值設置爲null,然後將其設置爲undefined,從堆中有效地移除已分配的空間(如果我理解正確),可以刪除分配的內存和引用。有什麼方法可以防止Javascript gc儘可能少運行?
所以我的問題是這樣的:是否有可能以這種方式編寫JavaScript,你可以消除gc?
(如果它是特定的實現,我想知道是否有可能在v8,但如果這是可能的犀牛或其他JS實現,這將是巨大的使用過的)
通過像LLJS項目評審我的請求不是太無理,但我不完全確定內存模塊是如何做到的。
我一直覺得它有幫助,如果我解釋爲什麼我問這麼回事。我非常喜歡編譯器,我想編寫一個編譯爲js語言,利用類似於SML的靜態推斷類型系統。之所以我想寫自己的原因是因爲我想利用區域推理來確定對象和變量何時超出範圍(儘可能),並且在離開範圍時將其從堆中移除,從而儘可能地消除gc可能。這主要是一個研究項目(閱讀:因爲我可以),所以任何在javascript中的內存優化資源也將不勝感激!
編輯:我想另一種說法是:「是否可以用gc確定性地永遠運行(儘可能)來編寫js?如果是這樣,將涉及哪些技術? 「
我並不是爲delete
本身看,因爲它標記刪除的元素,從而調用我想(試圖)避免,我很好奇,如果實施的gc會運行,如果我刪除所有引用(和值)與變量相關聯。
另外,改寫從SO參考答案:
x = foo; x = null; x;
爲X仍然在堆?
因此,換句話說,如果找不到對該對象的其他引用,則使用delete和GC釋放內存。所以程序員可能會釋放實際上導致釋放內存的對象。 –
@JaniHyytiäinen - 不是。 'delete'運算符僅用於從對象中刪除屬性或將數組元素置回'undefined'狀態。 'delete'不會爲變量做任何事情。對於那些,你將它們設置爲「null」或「undefined」。如果你想了解'delete',你可以閱讀[這篇文章](http://perfectionkills.com/understanding-delete/)。這是唯一可能的JavaScript開發人員刪除對象的引用。如果沒有其他引用該對象,GC將清理它。 – jfriend00
謝謝,我更新了我的問題,我希望它澄清 – pensivearchitect