- v8引擎的垃圾回收机制将js运营的内存控制为1.5g,可以用node --max-old-space-size=1700命令打开限制
- v8堆内存大小:1.4Gb(为什么限制在这个范围)
- scavenge垃圾回收算法:总共有三个空间,from空间,to空间,老生代空间,每次运算从from空间将存活的对象复制到 to空间,然后切换from和to空间的角色,再次进行复制,如此循环,将多次复制仍然存活的对象放入老生代空间(1.如何辨别 对象是否存活,老生代空间的对象会不会进行垃圾回收,这个对象具体指的是什么,是变量吗)
- Mark-Sweep & Mark-Compact:针对老生代内存设计的垃圾回收算法,遍历堆中所有对象,标记活着的对象,在清除阶段 清除没有被标记的对象,这么设计的原因是老生代内存中需要被清除的对象较少,但是此时会存在内存碎片,需要mark-compact 配合使用,移动对象,留出整块内存
- 新生代内存:函数作用域内声明的变量
- 老生代内存:全局变量和有被全局变量引用的闭包函数
- 老生代内存一般只会在进程结束的时候释放,所以对一些不再使用的内存通过赋undefined值和delete来清理内存
- 查看进程的内存占用:process.memoryUsage
- 查看系统的内存占用:os.totalmem() os.freemem()
- 堆外内存:buffer
- 内存当缓存:内存中没有设置过期时间,导致内存持续增长(最好借用外部缓存,可以进程间通信,也能避免内存泄漏)
- 不合理模块设计
- 原理:抓取堆内存快照,分析内存增长
- 相关模块:node-memwatch node-heapdump
- 读写大文件使用stream,使用的是堆外内存,不占用堆内存