簡體   English   中英

Node.js上奇怪的內存使用情況

[英]Weird memory usage on Node.js

這個簡單的代碼在一個數組中存儲了100萬個字符串(100個字符長度)。

function makestring(len) {
    var s = '';
    while (len--) s = s+'1';
    return s;
}

var s = '';
var arr = [];
for (var i=0; i<1000000; i++) {
    s = makestring(100);
    arr.push(s);
    if (i%1000 == 0) console.log(i+' - '+s);
}

當我運行它時,我收到此錯誤:

(...)
408000 - 1111111111111111111 (...)
409000 - 1111111111111111111 (...)
FATAL ERROR: JS Allocation failed - process out of memory

奇怪的是,100萬* 100只是100兆字節。

但是如果我移動s = makestring(100); 循環之外......

var s = makestring(100);
var arr = [];
for (var i=0; i<1000000; i++) {
    arr.push(s);
    if (i%1000 == 0) {
        console.log(i+' - '+s);
    }
}

執行沒有錯誤!

為什么? 如何在節點中存儲1百萬個對象?

在您將循環外的String生成移動的那一刻,您基本上只需創建一個String並將其推入數組一百萬次。

但是,在數組內部,只使用指向原始String的指針,這比消耗字符串一百萬次要少得多。

您的第一個示例構建1000000字符串。

在第二個示例中,您將使用相同的字符串對象並將其添加到陣列1000000次。 (它不是復制字符串;數組的每個條目都指向同一個對象)

V8做了很多事情來優化字符串的使用。 例如,字符串連接比您想象的要便宜(在大多數情況下)。 它不是構建一個全新的字符串,而是選擇以鏈接列表方式連接它們。

暫無
暫無

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

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