深入浅出Nodejs 5 内存管理

1. V8引擎垃圾回收机制与内存限制

64位系统约1.4G, 32位系统约0.7G内存

内存分代

新生代内存空间 –max-old-space-size

Scavenge算法

nodejs.png

老生代内存空间 –max-new-space-size

Mark-Sweep: 标记活着的对象, 删除死亡对象; 内存不连续, 影响后续内存分配.

Mark-Compact: 移动对象到一端, 清除边界外的内存.

回收算法 Mark-Sweep Mark-Compact Scavenge
速度 中等 最慢 最快
空间开销 少(有碎片) 少(无碎片) 双倍空间(无碎片)
是否移动对象 否 是 是

查看垃圾回收日志

node 启动时添加参数–trace_gc, 控制打印出内存分配日志

node 启动时添加参数–prof, 将会生成一个v8.log日志文件, 但是需要使用linxu-tick-processor v8.log进行查看

2. 高效使用内存

作用域内的变量, 随着作用域{}的创建和销毁.

回收内存过程:

  1. 标识符查找

查找当前作用域, 然后一级一级往上查找

  1. 作用域链

  2. 变量的主动释放

delete删除引用 或者 变量重新赋值(undefined))

闭包 实现外部作用域访问内部作用域中的变量方法

​ 一旦变量的引用闭包返回的函数, 函数内的作用域不会被释放.

3. 内存指标

查看内存使用事情

process.memoryUsage()

{

Rss: 常驻内存

heapTotal: 堆中总共申请的内存量

heapUsed: 当前对中使用的内存量

}

堆外内存

Bbffer使用堆外申请的内存, rss可以体现并且不受V8内存限制

4. 内存泄漏

内存泄漏原因

缓存: 直接使用内存作为缓存

队列消费不及时: 内存中维护队列, 队列不能及时消耗

作用域未释放

内存泄漏排查

V8-profiler

Node-heapdump

Node-mtrace

dtrace

Node-memwatch

大内存应用

大文件处理: node可以采用stream模块处理

版本控制

Version Action Time
1.0 Init 2019-08-25