JS无限循环:致命错误:无效的标记压缩接近堆限制分配失败-JavaScript堆内存不足


执行无限循环时出现内存堆错误
function test() {
let pairContract;
for (let i = 0; i < 1000; i++) {
let pairContract = new web3.eth.Contract(UNISWAP_ABI, '0x2e81ec0b8b4022fac83a21b2f2b4b8f5ed744d70');
pairContract = null;
}
}
const init = () => {
do {
test();
} while (1);
};
init();

基本上是新的web3.eth.Contract生成一个复杂的对象。

问题似乎是pairContract的每个实例在之前的test((执行之后从未从内存中完全删除。

我试图用setInterval替换do-while,但没有成功。还尝试了在测试函数末尾使用process.nextTick的递归方法,但也不起作用。

增加--max旧空间大小最终会出现与标题中所述相同的错误代码。

节点版本:v12.20.0

找到了答案。似乎使用具有全局作用域的web3实例来创建pairContract可以防止它被垃圾收集。

在测试函数中使用const web3 = new Web3('http://localhost:8545')创建web3实例解决了问题。

最新更新