JS 内存管理

什么是内存

JS中是在创建变量,对象,字符串等时自动进行分配内存,并且在不使用他们的时候“自动”释放,释放的过程叫做“垃圾回收”。

内存的生命周期

  • 内存分配:当我们声明变量,函数,对象时,系统会自动为他们分配内存。
  • 内存使用:读写内存,就是使用变量,函数等。
  • 内存释放:使用完毕,由垃圾回收机制自动回收使用的内存。

内存的概念

在硬件层面,计算机内存是由大量的触发器)组成的。每一个触发器都包含有一些晶体管,能够存储1比特。单个触发器可通过一个唯一标识符来寻址,这样我们就可以读和写了。因此从概念上讲,我们可以把计算机内存看作是一个巨大的比特数组,我们可以对它进行读和写。

有很多东西都存储在内存中:

  1. 所有被程序使用的变量和其他数据
  2. 程序的代码,包括操作系统自身的代码

当你编译你的代码时,编译器可以检查原始的数据类型并且提前计算出将会需要多少内存。然后把所需的(内存)容量分配给调用栈空间中的程序。这些变量因为函数被调用而分配到的空间被称为堆栈空间,它们的内存增加在现存的内存上面(累加)。如它们不再被需要就会按照 LIFO(后进,先出)的顺序被移除。

JS内存的分配

JS一般在定义变量时就完成内存分配。

JS使用内存

在JS中使用分配的内存,就是“读写变量的值 或 对象的属性,或给函数传参”

JS内存回收

当内存不再需要的时候需要释放掉

大部分的内存管理问题出现在这个阶段(这里最难的任务是指出在什么时候分配的内存不再被需要,这通常要开发者来决定程序中的哪一块内存不再被需要了,并释放)。

垃圾回收

  • 引用计数垃圾回收

最初的垃圾回收算法,“内存不再使用”,看内存中是否有指向它的引用。

  • 标记清除算法

标记清除将“不再使用的对象”定义为“无法达到的对象”。就是从根部出发定时扫描内存中的对象“但凡能从根部代打的对象都是需要使用的”无法从根部出发触及到对象被标记为不再使用“稍后进行回收”。



 

内存泄漏

1. 意外的全局变量

JS处理未定义变量的方式比较松“未定义的变量会在全对象创建一个新的变量在浏览器中”

  • 解决方法:使用严格模式,在文件头部添加'use strict'

2. 没有释放的计时器或回调函数

3. 脱离DOM的引用

4. 闭包


 

避免内存泄漏

简单来说就是不用的东西及时归还:

  1. 减少不必要的全局变量,使用严格模式避免意外创建全局对象。
  2. 在使用完数据后,及时解除引用(闭包中的变量,dom的引用,定时器清除)
  3. 组织好你的逻辑,避免死循环等造成的浏览器卡顿,崩溃问题

执行上下文

  • 可执行的代码段
  1. 全局执行上下文:不在任何函数中的代码,只有一个,this全部指向window。
  2. 函数执行上下文:只有调用函数才会为该函数创建一个新的执行上下文,可以有多个。
  3. Eval函数执行上下文:不建议使用。

  • 执行上下文的生命周期
  1. 创建阶段
  2. 执行阶段
  3. 回收阶段 (执行完毕后执行上下文会出 栈 等待垃圾回收);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值