Skip to content

Latest commit

 

History

History
33 lines (26 loc) · 1.87 KB

ram-control.md

File metadata and controls

33 lines (26 loc) · 1.87 KB

node内存限制

  • v8引擎的垃圾回收机制将js运营的内存控制为1.5g,可以用node --max-old-space-size=1700命令打开限制

v8垃圾回收机制

  • 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

内存泄漏的几种case

  • 内存当缓存:内存中没有设置过期时间,导致内存持续增长(最好借用外部缓存,可以进程间通信,也能避免内存泄漏)
  • 不合理模块设计

内存泄漏排查

  • 原理:抓取堆内存快照,分析内存增长
  • 相关模块:node-memwatch node-heapdump

大内存应用

  • 读写大文件使用stream,使用的是堆外内存,不占用堆内存