[英]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.