js 垃圾回收
v8的垃圾回收机制
- 首先v8的垃圾回收机制是有上限的,为什么有上限主要还是 js 是单线程的, 一旦开始执行垃圾回收机制,辣么他其他的各种逻辑需要暂停的。可以通过node --max-new-space-size= 2048 xxx.js
- 栈内存的话其实就是上下文切换之后,栈顶的空间会被自动回收
- 堆内存的话其实会分成两种 一种新生代 - 表示临时分配的内存
一种老生代 表示常驻内存, 存活的时间长。
新生代
- 正在使用的内存
- 闲置的内存
- 就是v8会将From 的对象检查一篇, 如果存活对象就是按照顺序从头放置,非存活直接回收。然后将 From 和 to 两个角色对调。其实主要为了处理内存碎片,将碎片在内存中顺序排好。
老生代
如果新生代中的变量经过多次回收依然存在,会放到老生代内存中, 这种叫晋升。发生晋升主要有两种情况:
- 经历过一次新生代垃圾回收
- 闲置空间内存占用超过25%
标记清楚:
遍历所有堆中的对象,打上标记。对代码环境中使用的变量或者强引用的取消标记, 剩下的就删除标记。同样会有内存碎片的问题:整理碎片像一端靠拢。
引用计数