【发布时间】:2015-07-31 17:08:19
【问题描述】:
以下代码导致节点消耗大量内存并在内存不足时崩溃。但是,如果我将找到的字符串的长度从 13 更改为 12,一切都很好。看起来正则表达式搜索返回的字符串包含对搜索的原始字符串的隐藏引用。但前提是找到的匹配项的长度至少为 13 个字符。 这是一个错误还是这种行为有什么好的理由?
function randString(length) {
var a = "a".charCodeAt(0),
result = [];
for(var i = 0; i < length; i++) {
result.push(a + Math.floor(Math.random() * 26));
}
return String.fromCharCode.apply(null, result);
}
var arr = [];
for(var i = 0; i < 1000000; i++) {
if(i % 1000 === 0) console.log(i);
var str = randString(13);
str = randString(5000) + "<" +str + ">" + randString(5000);
var re = /<([a-z]+)>/gm;
var next = re.exec(str);
arr.push(next[1]);
}
【问题讨论】:
-
您确定 12 个字符的版本也没有占用大量内存,但不足以使其崩溃吗?
-
12 个字符的版本使用少于 100 MB。但如果有 13 个或更多字符,则只需 145,000 次迭代即可达到 1.5GB。
-
我在 Chrome 中观察到同样的事情(版本 41.0.2272.76 构建于 Ubuntu 14.04,运行于 LinuxMint 17(64 位))
标签: javascript regex node.js memory-leaks