javascript的内存机制(学习笔记)

目录

JS的内存概述

基本数据类型在内存中的存储和使用过程

复杂数据类型在内存中的存储和使用过程

变量的复制

函数参数的传递其实是一种变量的复制

内存管理

内存泄漏的应对方法


 

JS的内存概述

javascript的内存分为栈内存堆内存,在栈内存中又有一个常量池

  1. 栈内存:用来存储基本数据类型
  2. 常量池:用来存放常量 基本数据类型(一般把它归类到栈内存中)
  3. 堆内存:用来存储复杂数据类型
  4. 当变量存储的基本数据类型时,该变量的值则存储在栈内存中

    当变量存储的是复杂数据类型时,该变量的对象存储在堆内存中

基本数据类型在内存中的存储和使用过程

由于基本数类型占用空间少,大小固定,且被频繁使用,因此保存在栈内存中

以数值型变量为例

javascript的内存机制(学习笔记)_第1张图片

当我们声明一个基本数据类型变量时,会在栈内存中存储变量名和具体值

又因为在js中变量名a是一个指针,a存储了JS生成的一个引用地址,该地址引用了数值1(即地址指向了数值1),所以当我们使用变量a的时,就等引用了数值1

复杂数据类型在内存中的存储和使用过程

由于复杂数据类型占用空间大,大小不固定,存栈中影响性能,所以存放在堆内存中

javascript的内存机制(学习笔记)_第2张图片

当我们声明变量来存储一个对象时,会在栈内存中生成一个变量名和一个具体值,而这个具体值是JS生成的一个引用地址,这个地址引用了存放在堆内存中的对象

当我们调用该变量时,解析器会根据变量对应的引用地址,引用对应的对象。

变量的复制

基本数据类型的变量

var num1=1;
var num2=num1;

上述代码中,num1和num2其实是两个不同的变量,它们之间的操作互不相关,这是因为在js中,这种变量复制其实是生成一个a变量的副本(即num2=1)

如图

javascript的内存机制(学习笔记)_第3张图片

复杂数据类型的复制

var person={name:'李华'}; //创建一个对象
var per=person ; //进行对象的复制

与基本数据类型变量的复制不同的是,当我们复制复杂数据类型对象时,其本质是复制该变量的引用地址,因此person和per引用地址是相同的,所有引用了同一个对象,无论是操作person还是per,都是在操作内存中的同一个对象

如图:

javascript的内存机制(学习笔记)_第4张图片

函数参数的传递其实是一种变量的复制

var x=1;
function fun (x){
    let y=x+1;
    //let是es6用来声明局部变量
}

 

内存管理

垃圾收集机制:

在js中,为我们提供了自动垃圾收集机制,但即使这样,还是会出现内存泄漏的情况。

内存泄漏概念:

当我们创建一个变量并赋值时,内存空间就会给这个变量分配一定的内存空间,因此在程序运行过程中,如果该变量不会再使用时,js垃圾回收机制会帮我们将这个变量在内存中释放掉(即删除),当我们没有及时释放内存时,内存的占用就会堆加,将会影响性能,若堆加到极限,将会使系统崩溃,我们把不需要的内存没有及时释放的情况称为内存泄漏。

 

垃圾回收机制的工作过程

1.判断内存是否不再被使用(有两种算法)

引用计数法:即检索是否有变量指针或引用地址指向该对象

标记清楚法:该方法与引用计数法相反,是从内存中的对象向上检索是否有指向该对象的指针或引用地址。如果没有,则被标记一个清除符号,等待清除

注意:垃圾回收检索是间歇性的,每隔一段时间进行一次,也因此,每隔一段时间进行垃圾回收

内存泄漏的应对方法

解除引用:通过把变量设置为null,来达到解除引用的目的

 

你可能感兴趣的:(前端笔记)