Skip to content
On this page

js 垃圾回收

v8的垃圾回收机制

  • 首先v8的垃圾回收机制是有上限的,为什么有上限主要还是 js 是单线程的, 一旦开始执行垃圾回收机制,辣么他其他的各种逻辑需要暂停的。可以通过node --max-new-space-size= 2048 xxx.js
  • 栈内存的话其实就是上下文切换之后,栈顶的空间会被自动回收
  • 堆内存的话其实会分成两种 一种新生代 - 表示临时分配的内存

一种老生代 表示常驻内存, 存活的时间长。

新生代

  1. 正在使用的内存
  2. 闲置的内存
  3. 就是v8会将From 的对象检查一篇, 如果存活对象就是按照顺序从头放置,非存活直接回收。然后将 From 和 to 两个角色对调。其实主要为了处理内存碎片,将碎片在内存中顺序排好。

老生代

如果新生代中的变量经过多次回收依然存在,会放到老生代内存中, 这种叫晋升。发生晋升主要有两种情况:

  1. 经历过一次新生代垃圾回收
  2. 闲置空间内存占用超过25%

标记清楚:

遍历所有堆中的对象,打上标记。对代码环境中使用的变量或者强引用的取消标记, 剩下的就删除标记。同样会有内存碎片的问题:整理碎片像一端靠拢。

引用计数