js高级-内存管理

149 阅读3分钟
    首先要明白任何编程语言,在代码的执行过程中都需要计算机给他分配内存,区别只在于编程语言对计算机分配的内存有不同的管
理方式。某些语言需要程序员自己管理这些分配的内存,如cc++等,而有些语言则是自动帮我们管理内存,比如我们的javaScript
和Java、Python、Swift、Dart等。

内存管理要点:

    第一步:分配申请你需要的内存(申请);
    第二步:使用分配的内存(存放一些东西,比如对象等);
    第三步:不需要使用时,对其进行释放;

内存管理区域

    js 能够管理的内存结构只有两种,栈结构,堆结构,管理的区域也只有栈区域和堆区域。
    
    至于栈结构和堆结构的基础知识在这里不做详细阐述,请自行学习。
    

js变量类型

    js中的变量有两种类型,基本数据类型和引用数据类型,所以js中只需要理解对这两种变量的内存如何管理即可。
    基本数据类型:
        数值(number)、布尔值(boolean)、nullundefinedstring(在赋值传递中会以引用类型的方式来处理)
    复杂数据类型:
        对象、数组、函数。

js 如何在内存中存放变量?

    (1)JS对于基本数据类型内存的分配会在执行时,直接在栈空间进行分配;
    (2)JS对于复杂数据类型(引用类型)内存的分配会在堆内存 中开辟一块空间,并且将这块空间的指针返 回值变量引用;
    辅助理解图如下:
    

截屏2022-04-23 下午8.50.52.png

js的垃圾回收

    因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间。在手动管理内存的
语言中,我们需要通过一些方式自己来释放不再需要的内存,比如free函数: 但是这种管理的方式其实非常的低效,影响我们编写逻辑
的代码的效率;并且这种方式对开发者的要求也很高,并且一不小心就会产生内存泄露;所以大部分现代的编程语言都是有自己的垃圾
回收机制。

GC

    垃圾回收的英文是Garbage Collection,简称GC;
    而我们的语言运行环境,比如Java的运行环境JVM,JavaScript的运行环境js引擎都会内存垃圾回收器;
    垃圾回收器我们也会简称为GC,所以在很多地方你看到GC其实指的是垃圾回收器;这里又出现了另外一个很关键的问题:GC怎么知道
哪些对象是不再使用的呢?这里就要用到GC的算法了

常见的GC算法

目前我了解的GC算法主要有两种,引用计数和标记删除法。
 1.引用计数
    引用计数算法简单来说就是:当一个对象有一个引用指向它时,那么这个对象的引用就+1,当一个对象的引用为0时,这个对象就
可以被销 毁掉;
    这个算法有一个很大的弊端就是会产生循环引用;

截屏2022-04-23 下午9.07.31.png

2.标记清除法
    这个算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对于哪些没有
引用到的对象,就认为是不可用的对象;
    这个算法可以很好的解决循环引用的问题;

截屏2022-04-23 下午9.08.07.png

** JS引擎比较广泛的采用的就是标记清除算法,当然类似于V8引擎为了进行更好的优化,它在算法的实现细节上也会结合一些其他的算法。在这里不做详细阐述**