繁体   English   中英

JS 无限循环:致命错误:无效标记压缩接近堆限制分配失败 - JavaScript 堆出 memory

[英]JS Infinite loop : FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

执行无限循环时出现 memory 堆错误

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 会生成一个复杂的 object。

问题似乎是在之前的 test() 执行之后,pairContract 的每个实例都不会从 memory 中完全删除。

我试图用 setInterval 替换 do while 但它不起作用。 还尝试了在测试 function 结束时使用 process.nextTick 的递归方法,但它也不起作用。

增加 --max-old-space-size 最终会得到与标题中所述相同的错误代码。

节点版本:v12.20.0

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM