1. V8引擎垃圾回收机制与内存限制
64位系统约1.4G, 32位系统约0.7G内存
内存分代
新生代内存空间 –max-old-space-size
Scavenge算法

老生代内存空间 –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. 高效使用内存
作用域内的变量, 随着作用域{}的创建和销毁.
回收内存过程:
- 标识符查找
查找当前作用域, 然后一级一级往上查找
作用域链
变量的主动释放
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 |