我正在使用 forever
包来运行我的 Node.js 脚本。 (不是网络服务器)。但是,正因为如此,我出现了内存泄漏,即使停止所有进程后,我的内存仍然被占用:
root@aviok-cdc-elas-001:~# forever stopall
info: No forever processes running
root@aviok-cdc-elas-001:~# forever list
info: No forever processes running
root@aviok-cdc-elas-001:~# free -lm
total used free shared buffers cached
Mem: 11721 6900 4821 5 188 1242
Low: 11721 6900 4821
High: 0 0 0
-/+ buffers/cache: 5469 6252
Swap: 0 0 0
还要提一下,当本地运行时,脚本不会出现内存泄漏,而不会永远。我在 Ubuntu 服务器上运行它。如果我现在重新启动服务器:
root@aviok-cdc-elas-001:~# reboot
Broadcast message from root@aviok-cdc-elas-001
(/dev/pts/0) at 3:19 ...
The system is going down for reboot NOW!
我的 RAM 将再次空闲:
root@aviok-cdc-elas-001:~# free -lm
total used free shared buffers cached
Mem: 11721 1259 10462 5 64 288
Low: 11721 1259 10462
High: 0 0 0
-/+ buffers/cache: 905 10816
Swap: 0 0 0
我还想提一下,当我的脚本完成它正在做的事情(并且最终完成)时,我有 db.close
和 process.exit
调用来进行确保我的脚本中的所有内容都被杀死了。然而,即使在 RAM 被拿走之后。现在我知道,永远会在脚本被杀死后再次运行该脚本。所以我的问题是:
- 如果脚本完成,我如何告诉forever不再执行脚本?
- 如何正确地永远停止,以便在停止后不占用任何 RAM?
我为此使用forever包的原因是因为我的脚本需要很多时间来完成它所做的事情,并且我的SSH session 将结束,我以常规方式运行的Node脚本也会结束。
最佳答案
据我所知,RAM 并没有被拿走或泄漏,而是被 Linux 用作文件系统缓存(因为未使用的 RAM 是浪费的 RAM)。
在 6900 兆“已用”RAM 中,5469 兆用作缓冲区高速缓存。当进程请求内存时,Linux 会自动减少此数量。
如果您希望长时间运行的进程在您注销后(或在您的 SSH session 被终止后)继续运行,您有多种不需要永远
的选项:
关于node.js - 服务器上的 Node Forever(npm 包)内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39815203/