我一直在尝试在node.js应用中追踪一个非常缓慢但持久的本机内存泄漏,而且我已经没有策略了。
该进程似乎是一个级别堆,但随着时间和日期的推移,node.js进程的RSS会慢慢增长。该过程是一个作业处理程序,它为不同的参数一遍又一遍地运行相同类型的作业。该过程的RSS增长与绘制累计工作数量的线的形状相同,因此每个作业运行都会以某种方式泄漏一些内存。
由于堆大致或多或少不变,标准堆检查工具似乎没有多大帮助。
以下是内存消耗情况的示例:
目前在节点0.8.7上运行。每个作业都执行大量数据库读/写操作,与redis实例通信,并使用mikael / request执行一些Web请求。
答案 0 :(得分:2)
我知道每个人都说:),我觉得我应该加入我的生产服务器上每两周更新我的node.js版本的乐队旅行车,当时我认为我有问题。听起来不是一个好主意吗?
所以我一直想知道同样的事情,我有几个node.js项目,我已经管理了几个月了(也是我去年写的)。似乎V8引擎或我的节点应用程序只是非常缓慢地占用内存并且永远不会释放它。 (它足够慢,我不得不偶尔重新启动它们)
这是非常紧张的,特别是考虑到它应该释放RSS内存,或最终达到峰值。
如果您对跟踪在运行时内泄漏的对象感兴趣(我的意思是javascript对象,函数等),mozilla有一个非常complete blog post关于追踪内存泄漏以及可用于执行此操作的项目的一些链接。
尽管如此,他们还没有列出这个。 (看起来很简单,我现在正在我自己的项目中试一试,看它是否有效,我倾向于不能正确编译任何基于V8的项目)
heapdump和here is a link to a how to guide。
根据我自己的经验,V8引擎似乎分配内存,并保持它只是因为它需要以后完全相同的内存块。我的兄弟已经大量使用Node.js大约3年了,也看到了同样的事情。
另外,为了完整性(我知道你已经拥有),如果有人想要确认你没有泄漏V8中的内存,来自joyent的工程师有一个相当不错的写作how to track V8 memory leaks down