缘由

公司同事内部分享的一篇讲解查找内存泄漏的博客,个人觉得很赞,就决定翻译一下,翻译不重要的地方会略过。英文不太好,翻译不好的地方或者有错误的地方欢迎指正。 原博客链接http://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/

简介

几个月前,有一次出现内存泄漏,不得不调试,查找问题所在。我查找了一些相关的资料和文章,但是认真仔细读过之后,还是有疑惑到底应该怎么去调试查找问题的所在。

我希望这篇文章对查找node中的内存泄漏有一个简单的引导。我将使用一种简单的方式来引导查找内存泄漏的问题。个人认为这种方式可以满足大部分需求。对于某些情况,这种方式可能不行。我将提供一些其他的资料供你参考。

最小理论

JavaScript是一种垃圾回收语言。因此,所有的内存使用都是由一个node进程来管理自动的分配和回收,通过V8 JavaSript引擎。

V8 怎么知道什么时候去回收内存?在程序中,从跟节点开始,V8有数据图始终保存所有变量的。在JavaScript中有四种数据类型。真假值,字符串,数字和对象。前3种都是简单类型,这3种数据类型能够保存数据指向他们。对象和其它所有类型都是对象类型(数组也是对象类型),都能保存引用指向其它的对象。

V8周期性的根据这个内存引用列表,试着查找一些从根节点无法查找到的数据。如果这些数据无法在根节点上查找到,V8 就确认这些数据不在被使用并且释放掉这些内存。这个机制被叫做垃圾回收。

什么时候会发生内存泄漏?

在JavaScript中内存泄漏发生在当数据不需要,在根节点中依然可以查找到时。 V8 会认为这些数据依然在使用而且不会释放掉这些数据对应的内存。为了能够调试内存泄漏问题,我们需要保存该数据通过错误调用,并且确保V8 能够去清理掉

非常重要的是要记住,垃圾回收并不是每时每刻都在清理。一般V8 在认为合适的情况下会执行垃圾回收。例如,V8 会周期性的执行垃圾回收,或者当V8 发现剩余内存变少到一定量的时候也会执行一次垃圾回收。节点有所有变量的内存链连接所有的进程,因此V8能够智能地随时调用。

未完待续。。。