什么是内存
JS中是在创建变量,对象,字符串等时自动进行分配内存,并且在不使用他们的时候“自动”释放,释放的过程叫做“垃圾回收”。
内存的生命周期
- 内存分配:当我们声明变量,函数,对象时,系统会自动为他们分配内存。
- 内存使用:读写内存,就是使用变量,函数等。
- 内存释放:使用完毕,由垃圾回收机制自动回收使用的内存。
内存的概念
在硬件层面,计算机内存是由大量的触发器)组成的。每一个触发器都包含有一些晶体管,能够存储1比特。单个触发器可通过一个唯一标识符来寻址,这样我们就可以读和写了。因此从概念上讲,我们可以把计算机内存看作是一个巨大的比特数组,我们可以对它进行读和写。
有很多东西都存储在内存中:
- 所有被程序使用的变量和其他数据
- 程序的代码,包括操作系统自身的代码
当你编译你的代码时,编译器可以检查原始的数据类型并且提前计算出将会需要多少内存。然后把所需的(内存)容量分配给调用栈空间中的程序。这些变量因为函数被调用而分配到的空间被称为堆栈空间,它们的内存增加在现存的内存上面(累加)。如它们不再被需要就会按照 LIFO(后进,先出)的顺序被移除。
JS内存的分配
JS一般在定义变量时就完成内存分配。
JS使用内存
在JS中使用分配的内存,就是“读写变量的值 或 对象的属性,或给函数传参”
JS内存回收
当内存不再需要的时候需要释放掉
大部分的内存管理问题出现在这个阶段(这里最难的任务是指出在什么时候分配的内存不再被需要,这通常要开发者来决定程序中的哪一块内存不再被需要了,并释放)。
垃圾回收
引用计数垃圾回收
最初的垃圾回收算法,“内存不再使用”,看内存中是否有指向它的引用。标记清除算法
标记清除将“不再使用的对象”定义为“无法达到的对象”。就是从根部出发定时扫描内存中的对象“但凡能从根部代打的对象都是需要使用的”无法从根部出发触及到对象被标记为不再使用“稍后进行回收”。
内存泄漏
- 意外的全局变量
JS处理未定义变量的方式比较松“未定义的变量会在全对象创建一个新的变量在浏览器中”
- 解决方法:使用严格模式,在文件头部添加’use strict’
没有释放的计时器或回调函数
脱离DOM的引用
闭包
避免内存泄漏
- 不用的东西及时归还
- 减少不必要的全局变量,使用严格模式避免意外创建全局对象。
- 在使用完数据后,及时解除引用(闭包中的变量,dom的引用,定时器清除)
- 组织好你的逻辑,避免死循环等造成的浏览器卡顿,崩溃问题。
执行上下文
- 可执行的代码段
- 全局执行上下文:不在任何函数中的代码,只有一个,this全部指向window。
- 函数执行上下文:只有调用函数才会为该函数创建一个新的执行上下文,可以有多个。
- Eval函数执行上下文:不建议使用。
-执行上下文的生命周期
- 创建阶段
- 执行阶段
- 回收阶段 (执行完毕后执行上下文会出 栈 等待垃圾回收);
Author: 李金帅
Link: https://lijinshuai21.github.io/Li_JinShuai_Blog/2020/06/01/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.