代码之家  ›  专栏  ›  技术社区  ›  Balanarayanan

节点中的活动句柄是什么。js公司

  •  19
  • Balanarayanan  · 技术社区  · 7 年前

    我看到我的应用程序活动句柄数不断增加。活动句柄的确切数量是多少?这是我必须注意防止应用程序崩溃的事情吗?

    2 回复  |  直到 7 年前
        1
  •  19
  •   Thomas Dondorf    5 年前

    活动句柄

    句柄是对打开的资源(如打开的文件、数据库连接或请求)的引用。为了理解为什么句柄可能处于活动状态,尽管它们本应被关闭,我给您一个简单的示例:

    const http = require('http');
    
    http.createServer((req, res) => {
        if (req.url === '/secret-url') {
            return; // nobody should have access to this part of our page!
        }
    
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World!');
    }).listen(3000);
    

    这个代码是做什么的?它在端口上运行服务器 3000 并返回 Hello World 任何请求的消息,但转到“机密URL”的请求除外。但这段代码中有一个问题。当我们遇到“secret”if子句时,我们从不关闭连接。这意味着客户端将保持连接的开放时间,只要他愿意。我们应该关闭连接。如果犯此错误,活动句柄的数量将增加,从而导致内存泄漏。

    通常,内存泄漏更难检测,因为活动句柄可能会从一个函数传递到另一个函数,因此很难跟踪哪一个代码负责关闭连接。

    活动句柄数量的增加意味着什么?

    如果您看到打开的句柄不断增加,那么代码中很可能存在内存泄漏。如示例中所示,您可能忘记关闭资源

    内存泄漏尤其严重,如果您计划开发一个应该运行很长时间的脚本,比如web服务器。。。

    如何检查内存泄漏?

    有多种方法可以检查内存泄漏。显然,最简单的方法就是关注记忆。pm2甚至内置了一个选项,以便在内存达到某一点时重新启动进程。有关此主题的更多信息,请访问 this guide .

    这和木偶演员有什么关系?

    有两件事。首先,请求非常便宜。即使节点中存在内存泄漏。js服务器应用程序,只有在几千个请求之后,您才能在内存中看到它。与此相反,木偶演员 非常 昂贵的打开Chromium浏览器将消耗50到100 MB的内存。因此,您应该确保启动的每个浏览器都将关闭。其次,正如前面提到的另一个答案,有一些对象(如 elementHandle )您需要手动处置以清除其资源。

        2
  •  1
  •   Ramiro Ramirez    7 年前

    Puppeter实际上有一种方法可以在您完成句柄处理后使用,以便垃圾收集器可以完成其工作。 你应该使用 elementHandle.dispose() 这样地:

    const bodyHandle = await frame.$('body');
    const html = await frame.evaluate(body => body.innerHTML, bodyHandle);
    // Once you're done with you handle just get rid of it
    await bodyHandle.dispose();
    

    查看文档: