1. 内存治理
-
分配内存:挖坑 ,要依据不同的类型调配不同的内容
- js 根底类型:string、number、boolean、undefined、null、symbol。占用空间大小固定、体积轻量。放在栈内存中存储。
- js 简单类型:Object。占用空间大小不固定。放在堆内存中存储。
-
读写内存:用坑
- js 根底类型:获取时间接从栈中取走变量的值。
- js 简单类型:获取时,先从栈内存中获取对象的援用(堆内存中的地址),而后再去堆内存中查问,拿到具体的数据。
-
开释内存:还坑 ,垃圾回收
-
援用计数法:
- 古代浏览器曾经不必这种了
- 内存中每一个变量都对应一个援用计数,当计数为 0 的时候开释内存
- 存在的问题:无奈删除循环援用的对象,容易引起内存透露
-
标记革除法:
- 从 window 对象开始,扫描所有能够通过根对象触达的变量,这些对象被标记为‘可触达’。
- 遍历所有对象革除没标记的对象,并将标记复原到默认。
- 回收相应的空间
- 毛病:回收的对象在地址上是不间断的,导致空间尽管被回收了,然而不间断,导致后续调配空间的不好应用,而节约空间。而且不会立刻回收垃圾对象
-
标记整顿法:
- 标记阶段是一样的;
- 革除之前会先整顿空间,挪动地位,使被开释的空间在一个间断的空间。
- 新生代(存活工夫短,占比小)+ 老生代。新生代(from + to),存活的从 from 移到 to,不存活的开释;而后调换地位;如果 to 中超过 25%,则放到老生代。老生代:将活的挪动到一侧;革除边界外的所有;
-
在理论中还做了一些优化:
- 遍历一次对象的耗时可能比拟久,在执行时存在肯定的提早。所以引擎会将垃圾回收合成为几个局部,各个局部别离执行,减小提早。
- 为了缩小对执行的影响,垃圾回收只在 CPU 闲暇的时候运行
2. 内存透露
-
- 意外的全局变量
- 没有革除 setInterval、间断的 setTimout
- 没有删除对 DOM 的援用