maj*_*rif 7 memory-leaks node.js
我正在运行我的服务器,pm2 start ...并在2小时后pm2 monit向我展示3GB memory.所以我附上了记忆,现在我再等了2个小时,再次显示pm2 monit到达的记忆3GB.
所以,我检查了生成的日志memwatch.给我看了:
{ before: { nodes: 75659, size_bytes: 11141702, size: '10.63 mb' },
after: { nodes: 73226, size_bytes: 10840598, size: '10.34 mb' },
change:
{ size_bytes: -301104,
size: '-294.05 kb',
freed_nodes: 5141,
allocated_nodes: 2708,
Run Code Online (Sandbox Code Playgroud)
而另一个:
{ before: { nodes: 72591, size_bytes: 10728318, size: '10.23 mb' },
after: { nodes: 73284, size_bytes: 10798062, size: '10.3 mb' },
change:
{ size_bytes: 69744,
size: '68.11 kb',
freed_nodes: 5931,
allocated_nodes: 6620,
Run Code Online (Sandbox Code Playgroud)
现在我真的很困惑,那些是最后的日志,所以我很确定这些是pm2 monit显示巨大的内存泄漏时生成的日志.
那么,为什么要向memwatch我展示10MB+内存和pm2 monit显示3GB+?
现在切换到类似forever或monit的东西,看看泄漏是否仍然存在.
多一点背景
小智 6
在这个线程上有很多非常糟糕的答案。真的,真的很糟糕。
答案很简单:您的代码存在需要查找和删除的内存泄漏,而且 GC 错误的可能性很小,您的代码更有可能是罪魁祸首。
所以首先:
其次,实际的解决方案应该是:
使用您选择的工具分析您的代码的内存和 CPU 使用情况。对于大多数人来说,这将是连接到正在运行的节点实例的 Chrome 调试工具,并查看哪些函数导致内存使用量激增。简单地手动调用 GC 是很懒惰的,因为您的代码仍然存在泄漏,但您只是告诉 V8 在您的应用程序泄漏后不断地吸纳内存,这是非常懒惰的做法。
pm2 启动 app.js --node-args='--expose-gc'
上面的参数--expose-gc将允许我们从 Node js 强制调用垃圾收集器,现在使用以下代码强制车库收集。
if (global.gc) {
global.gc();
} else {
console.log('Garbage collection unavailable. use --expose-gc '
+ 'when launching node to enable forced garbage collection.');
}
Run Code Online (Sandbox Code Playgroud)
这将解决 PM2 内存泄漏问题。
| 归档时间: |
|
| 查看次数: |
5540 次 |
| 最近记录: |