垃圾回收
js 内存概念
基础类型保存在栈中,系统会自动处理 引用类型,栈只保存堆的引用地址,值保存在堆中,垃圾回收针对的就是这个堆中的引用数据。
全局变量的引用类型,会一直存在应用的生命周期里,不会被垃圾回收清除,但可以把该变量置为 null,那么它将被垃圾回收器回收,即使它是全局对象的属性。
引用计数法
变量声明、引用计数+1,变量被重新赋值-1,等于 0 时,被执行
弊端
循环引用,导致引用无法清除
标记清除法
垃圾回收器区将所有内存中的对象打上标记,然后从根结对象开始遍历,把还在上下文中的活动变量去掉标记,然后清理所有带标记的对象
弊端
内存碎片化,分配速度慢。老生代会有标记整理算法去解决
分代回收法
新生代
内部又分为使用区,空闲区
- 新声明的对象都会放入使用区
- 垃圾回收时,会在使用区中寻找活动的对象,将其复制到空闲空间,如果标记有经历过一次的 scavenge 算法(垃圾回收)的则晋升到老生代的存储区里
- 然后清空使用区,将当前空闲区和使用对调
老生代
使用标记清除法和标记整理算法回收
JStar