李金帅
能将喜欢的东西留在身边,这就是我努力的意义。

内存管理

2020-06 内存
Word count: 999 | Reading time: 3min

什么是内存

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

内存的生命周期

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

内存的概念

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

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

JS内存的分配

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

JS使用内存

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

JS内存回收

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

垃圾回收

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

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

内存泄漏

  1. 意外的全局变量
    JS处理未定义变量的方式比较松“未定义的变量会在全对象创建一个新的变量在浏览器中”
  • 解决方法:使用严格模式,在文件头部添加’use strict’
  1. 没有释放的计时器或回调函数

  2. 脱离DOM的引用

  3. 闭包

避免内存泄漏

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

执行上下文

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

-执行上下文的生命周期

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

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.

< PreviousPost
HTTP请求响应
NextPost >
AJAX,GET,POST
CATALOG
  1. 1. 什么是内存
  2. 2. 内存的生命周期
  3. 3. 内存的概念
  4. 4. JS内存的分配
  5. 5. JS使用内存
  6. 6. JS内存回收
  7. 7. 垃圾回收
  8. 8. 内存泄漏
  9. 9. 避免内存泄漏
  10. 10. 执行上下文