为什么前端要注意内存管理
第一,减少浏览器的负担。内存如果占用过大的话,会让浏览器压力过大,导致浏览器卡顿,用户体验很差。 第二,如果是我们用node开发后端,内存如果占用过大,服务就会中断,甚至会造成经济损失。
内存的数据存储
内存其实就是我们存变量的。前端在内存中存变量,我们分成两种类型去存。称之为栈内存和堆内存。 他们只是一种数据结构,而不是说内存这个硬件一部分就是堆内存,一部分是栈内存。 栈内存是连续的,后进先出的。 堆内存是一个非线性的数据结构。它每一个点就是一个内存地址,他不一定是连续的。 在JavaScript中,基本数据类型是放在栈内存中。 而引用数据类型本身,是放在堆内存里,然后把它的引用地址,放到栈内存的变量里。
浏览器的v8引擎所能占用的内存
我们知道主流的chrom等浏览器使用的js引擎是v8引擎,它在目前主流的64位浏览器中的内存占用,基本上是1.4G,当然,浏览器或多或少是可以增加的。
V8引擎的垃圾回收简介
V8引擎有自己的垃圾回收机制,他是很复杂的。我们现在可以做一个最简单的理解。 V8的内存可以分为新生代和老生代。其中新生代的内存空间很小,用于存放比较短时间使用的变量。而长时间使用的变量,被放入老生代。 新生代和老生代的垃圾回收机制也是不同的。
新生代的垃圾回收机制
新生代又划分成了两部分。一部分可以理解为from,一部分理解为to。 初始状态下,to空间是空的。所有的变量都放在from里。当垃圾回收执行的时候,被标记为仍然使用的变量,复制到to空间,然后直接清空from空间。最后再对调from和to。 形成一个垃圾回收循环。 新生代的垃圾回收简单来说就是复制+清空,是牺牲了一部分空间去提高执行效率的,因为to空间只用来垃圾回收而不存变量。
老生代的垃圾回收机制
老生代因为空间占用大,不适合使用新生代的方法。老生代的垃圾回收分三步
- 标记已经不再使用的变量
- 清除标记的变量
- 整理磁盘