你们写的 NodeJS 程序有没有内存泄漏?
你们写的 NodeJS 程序有没有内存泄漏?
从 Python 转 Node,写了三个微服务,尼玛每一个都出现了内存泄漏,连续运行几天就会 OOM。
以前 Python 也写过几个,运行个几年都没问题的。
闭包用多了吧?
对象深复制了吗?
函数副作用太多了?
我记得最近有个版本的 node 本身就有 ssl 上的内存泄露。。
Python 也有内存泄漏啊…不过一般 wsgi 会自动进程重启
Node 内存泄漏挺常见的,不过你这么严重的换个最新版本看看,如果还有问题应该还是使用有问题
神 tag
😆 神回复
你用什么框架写微服务?
我们公司用 node 写的很多服务,几个跑在一台阿里云上也。几年也没问题啊,上代码才是关键。
之前用 4.4.6 版本的时候发现内存回收有问题,用了 v7.4.0 就舒服多了,代码一点没动。
同样会经常内存爆掉,问下大神频繁的使用 promise 模式会导致内存过高吗?
懒得排查就设置 pm2 超内存自动重启…
有一次循环变量忘改了,运行的时候感觉好慢,就去了趟厕所,回来的时候报内存泄漏。
嗯,就这一次。
代码有点多没法上。
目前暂时用一个 setInterval 检查 process.memoryUsage()看内存是否高到指定值就主动自杀重启避免用光内存。
以后有空了需要用正规方法看一下到底是哪个地方有泄漏。
排查一下是否有太多对象做缓存没有释放,或者一些队列没有释放,长期驻在老生代中,就会泄露
node 某几个版本有内存泄露的 bug, 你搜搜。
不行上自动重启。
想简单解决的话用 pm2 就好了
写了好多个服务,小的倒是会出现这个问题,大的到现在还没遇到.
然后你那个 M 之前的是什么数字…
有
之前有个项目, 怀疑内存泄露, 一直没找到原因, 后来, 在 配置了 pm2 自动重启, 内存到 1G 就自动重启, 一直到现在稳定运行~~
内存泄漏是 NodeJS 的一部分,不爽不要写…
定时调一下 gc ?
之前写的高负载爬虫出现过内存炸的情况,但不是内存泄露,只是闭包引用导致的内存占用过高,调节一下负载,减少变量传递,注意点用字符串函数就可以了。
对,现在我发现了,我的三个服务只有一个是有泄漏的。
其中二个是头一天运行的内存都在 400M 以内,二天后慢慢上去,会稳定在 700M RSS,我的内存自杀阀值 512 设得太低了。(难道是和 V8 有关,运行次数多了后 JIT 优化代码导致内存使用增加)。
最后一个压图片的服务只有 200 行代码,太简单了所以没加内存高自杀设置,但运行十几天后内存爆掉了,用了 sharp 这个大 native 库,可能那个库有泄漏。
在Node.js程序中,内存泄漏是一个常见但可管理和避免的问题。Node.js采用V8 JavaScript引擎,其内存管理主要通过垃圾回收机制(GC)自动处理。然而,不当的编程实践仍可能导致内存泄漏。
以下是一些可能导致内存泄漏的常见情况以及如何避免它们的示例:
-
未释放的事件监听器: 如果不断添加事件监听器而没有适当移除,会导致内存泄漏。
const EventEmitter = require('events'); const myEmitter = new EventEmitter(); function onEvent() {} myEmitter.on('event', onEvent); // 记得在不需要时移除监听器 myEmitter.removeListener('event', onEvent);
-
闭包和全局变量: 不当使用闭包或全局变量会阻止GC回收内存。
function createLeak() { let leak = []; setInterval(() => { leak.push(new Array(1e6).fill(0)); // 模拟内存泄漏 }, 1000); } // 避免在函数外部持有不必要的引用
-
第三方库: 使用不稳定的第三方库也可能导致内存泄漏。定期更新和测试依赖库很重要。
为了检测和调试内存泄漏,可以使用Node.js的工具如--inspect
标志、Chrome DevTools,或第三方库如heapdump
和memwatch-next
。
总之,虽然Node.js程序有可能出现内存泄漏,但通过良好的编程实践和适当的工具,可以有效地检测和管理这些泄漏。