前一段开发的时候遇到个问题,说out of memory。这是一个很明显却不常见的问题,一般情况下还不好遇到,遇到了也很好解决。趁着遇到这个问题,自己也翻了翻了关于node的内存管理,在这里做个总结以及遇到这种问题应该如何解决。
先说一下node的一些背景,大家都知道node和v8是分不开的。v8作为node的JavaScript的脚本引擎,node在享受v8的优点时,也会受到v8的限制,尤其是内存限制。在一般的后端语言中好像基本对内存没有什么限制,但是在node中使用内存时就会发现内存好像只使用了一部分,并没有全部使用。恭喜你,如果你感觉到只是用一部分的时候,你需要小心使用你的内存了。在64位系统中内存约1.4G,32位中是0.7G,不要问我为什么是这么大,因为我是查资料查到的,跟v8的源码有关系,知道的老哥可以留言告诉我。
下面内容分五部分:v8的内存介绍、v8的垃圾回收机制、如何主动释放对象、使用pm2管理node进程时如何解决内存溢出和其他。
一、v8的内存介绍
很早看到说JavaScript的所有对象都是通过堆来分配的,这句话说对也对说不对也不对。如果你认为万物皆对象那么这句话就错了,但是其实是“万物皆对象”这句话错了。简单说一下就是用typeof()
函数看一下,如果是object那么就是引用类型也叫对象类型,不是object和undefined就是基本类型。对象类型是存在堆里的,基本类型是存在栈里的。
举个例子,看下面的变量存储情况。
const a = 1; //栈
const b = 'hello'; //栈
const c = [1]; // c 存栈,[1]存堆
const d = {
name: 'zhengsy' }; // d 存栈,{ name: 'zhengsy' }存堆
a = 2; // 报错
c.push