[nodejs] 了解内存泄漏

什么是内存泄漏

内存泄漏(Memory Leak)指因为疏忽或错误形成程序未能释放已经再也不使用的内存的状况。 javascript

若是内存泄漏的地方恰好是程序执行的重要位置,那么程序就可能会由于堆积愈来愈多无用的内存,致使程序愈来愈慢,最终致使程序崩溃。java

GC (Garbage Collection,垃圾回收)

nodejs是执行javascript的V8引擎,说nodejs的GC就是说V8引擎的GC。node

在V8中,每次GC时,是由root对象开始,依次梳理对象的引用,若是能够从root对象的引用链拿到,那么标记为可达到对象,不然为不可达到对象,不可达到对象就会被GCc++

内存泄漏的常见状况

由GC的原理可知,内存泄漏就是应该被回收的内存,由于被标记为可达到对象而没有被正常回收。web

1. 全局对象

a1 = 'a1';

global.a2 = 'a2';

2. 闭包

闭包是函数访问其余函数中的变量,致使这个变量保留在内存中不被GC.缓存

const fun1 = function() {
    const data = new Buffer(100);

    fun2 = function() => {
        void data
    }
}

上方例子中data不会被GC
例子是直接将fun2挂载到了root对象上,与实际开发中的可达到对象相同。服务器

3. 事件监听

当咱们向一个可服用对象添加事件监听时就有可能会发生这种状况。闭包

在使用 Node.js 的 http 模块时,不经过 keepAlive 复用是没有问题的,复用了之后就会可能产生内存泄漏。svg

4. 其余缘由

还有一些其余的状况可能会致使内存泄漏,好比缓存。在使用缓存的时候,得清楚缓存的对象的多少,若是缓存对象很是多,得作限制最大缓存数量处理。还有就是很是占用 CPU 的代码也会致使内存泄漏,服务器在运行的时候,若是有高 CPU 的同步代码,由于Node.js 是单线程的,因此不能处理处理请求,请求堆积致使内存占用太高。函数

小结

原文中还提到了如过出现了内存泄漏,该如何定位。
相比 古老的c/c++,GC机制让咱们编写js/java要放心的多,虽然还会有可能出现内存泄漏问题,可是只要咱们了解内存泄漏的缘由,编写程序时注意,就会必定程度上避免内存泄漏的问题。

这里是原文地址