gpt4 book ai didi

javascript - Node 正则表达式解析器中的内存泄漏?

转载 作者:搜寻专家 更新时间:2023-11-01 00:42:20 24 4
gpt4 key购买 nike

下面的代码导致node消耗大量的ram,内存不足时崩溃。但是,如果我将找到的字符串的长度从 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]);
}

最佳答案

我在 Chrome 中观察到相同的行为。我认为两者(node.js 和 Chrome)的行为相同,因为它们基于相同的 Javascript 引擎(V8)。

没有内存泄漏,但是Javascript中的垃圾管理有问题。我从观察中推断出这一点,即当我在 Google Dev Tools 中强制垃圾收集时释放了 GB 的内存。

您可以强制运行垃圾收集器,如explained here .这样,您的 node.js 就不会崩溃。

编辑

进一步测试我可以告诉这些事情:

关于您的评论但是只要仍然有对数组的引用,就不会释放任何内存。:

它看起来比那更复杂,但你是对的,arr 似乎占据了所有空间 1.1 去寻找 100'000 个项目,这是每个项目 10kB。当您查看数组 next 时,它确实有大约 10kB 的大小(next.input 为 10015 字节。如果一切都按预期工作,next[1 ] 将是一个简单的字符串,只使用略多于 13 个数据字节,但事实并非如此。在数组 arr 中引用 next[1] > 不允许对 next 进行垃圾回收。

作为解决方案,我想出了这个修改后的代码(fiddle):

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 < 100000; 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].split('').join(''));
}
console.log(arr)

诀窍是通过拆分字符串并再次连接它来切断 next 和存储在 arr 中的字符串之间的引用。

我对内部结构一无所知,但它看起来像是 V8 中的一个错误。在 Firefox 上测试相同,一切都按预期工作,并且没有过多的内存使用。

关于javascript - Node 正则表达式解析器中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com