[eval()JavaScript内存泄漏

问题描述 投票:-1回答:1

我有一个私人客户端,它以字符串形式发送服务器javascript以执行。这可以按预期工作,但是,每当我向服务器发送JS的有效负载时,内存就会增加,但是我的内存使用量永远不会下降。

这是node.js代码:

app.post(`/`, (req, res) => {
  const final = req.body.toString();
    function executeJS(str) {
    return new Function(`'use strict'; ${str}`)();
  }
  res.status(200).json(executeJS(code)).end();
});

我已附上我的内存使用情况的屏幕截图。可以猜到,大约8:45,我向服务器发送了几个请求。在处理完请求后很长时间内存就会增加并继续保持该级别。

memory usage

javascript node.js express memory-leaks eval
1个回答
0
投票

是。这就是它的工作方式。 Javascript代码(一旦在nodejs中加载并编译)就不会被垃圾回收,因此您以这种方式运行的代码越多,进程存储的代码就越多。

为了安全性,安全性和内存管理,您可以经常在child_process或WorkerThread中运行此代码,然后每隔一段时间回收(破坏和重新创建)该子代或worker以摆脱旧代码。

[此外,在查找内存泄漏时,您不能仅仅因为内存使用率上升而一直保持上升来判断泄漏。仅当内存使用量随着时间的推移不断增加时才证明存在内存泄漏。内存增加但不会减少的情况可能是一个进程,只是没有将未使用的内存返回给OS,但是该内存可在该进程中重用。这将不是实际的泄漏。因此,您还必须确保实际泄漏。

但是,您描述的不断运行越来越多的代码的情况在我看来确实听起来像是将造成泄漏之类的情况,即消耗越来越多的内存。此使用模型不是node.js专门设计的。因此,您必须使用一种变通办法,例如WorkerThread(这是一个单独的V8实例)或一个子进程(也是一个单独的V8实例),您可以不时地一次核对以回收旧代码使用的内存。


我还将补充一点,让服务器接受外界的代码并在您的主服务器进程中“运行”它是非常不寻常的。正如其他人提到的那样,无论采取何种预防措施,该体系结构都具有各种安全漏洞。发送数据,然后运行处理数据的代码,或者如果您真的必须接受外界的未知代码,然后再在另一个进程中运行它,甚至可能是沙盒进程,以保护服务器不受它的任何攻击,这是更常见的可能会发生-意外崩溃,意外错误(例如while循环卡住)还是恶意行为。

© www.soinside.com 2019 - 2024. All rights reserved.