簡體   English   中英

是否會收集JavaScript基本類型的垃圾?

[英]Are JavaScript primitive types garbage collected?

我知道在Java和C#中,垃圾收集器僅用於引用類型(不適用於原始類型),並且僅用於堆,因為Java和C#中的對象存儲在堆中。

關於JavaScript,引用類型(數組,對象,函數)存儲在堆中,原始類型(數字,布爾值,字符串,未定義,空)存儲在堆棧中。 這是關於此的鏈接

在JavaScript中,有幾種垃圾收集器算法,其主要原理是引用計數。 這些算法是“標記掃描”和“參考計數”(現代的是“標記掃描”)。 該算法計算引用,原始類型沒有引用,我猜是不能將其垃圾收集。

在文章中,沒有關於如何釋放JavaScript基本類型的消息。 我的意見是,當當前執行上下文完成其工作時,它將釋放。

那么,JavaScript實際上如何管理原始類型變量的內存?

ECMAScript語言規范中沒有任何內容表明原始資源不會被垃圾收集。 同樣,規范中也沒有任何內容說明基元是垃圾收集的。 實際上,在規范中也沒有任何內容表明對象是垃圾收集的。

確實,該規范完全沒有說明內存管理。 例如,不使用堆棧的實現將完全兼容。

因此,簡短的答案是:您無法知道是否原始類型是垃圾回收的,因為規范同時允許兩者。

正如@JörgWMittag所說,該規范沒有告訴我們,除了沒有顯式的free操作,因此有時除了自動內存管理(例如垃圾回收)之外別無選擇。

JavaScript定義了以下內容:

基本值是以下內置類型之一的成員:Undefined,Null,Boolean,Number,String和Symbol

未定義,空值,布爾值和數字均具有固定大小的格式。 例如,數字是根據IEEE 64位浮點定義的。 對於局部變量,這些固定大小的格式最有可能直接在堆棧上表示,而不是在堆上分配。 但是,JavaScript變量的類型不同於Java變量,因此這些變量可以在執行期間更改其類型,這意味着有時程序會執行某些操作,詢問變量是什么類型,有時需要運行時將其動態存儲為以及價值。 盡管如此,該信息的大小也可能是固定的(例如,指針),這意味着即使類型和數字的組合也可以存儲在固定大小的堆棧分配存儲中。

JavaScript通過復制來傳遞這些原始類型。 它沒有提供對原始機制的引用(這會使它們的存儲管理復雜化)。 但是,它確實具有閉包,並且它們捕獲變量而不是值。 這意味着有時局部變量必須超出其局部范圍,這表明必須為它們使用堆。

另一方面,String類型可能涉及動態堆分配,因為例如,字符串可以是在調用函數中生成並返回給調用方的動態大小的臨時值。 在某些情況下,可能不會為字符串分配堆(例如,文字),因此不會進行垃圾回收。

另一方面,Java定義了特定大小的基本類型,而String不是其中的一種(String是對象類型)。

暫無
暫無

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

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