美文网首页js css html
JS 内存管理 GC算法

JS 内存管理 GC算法

作者: 咸鱼不咸_123 | 来源:发表于2022-04-13 19:33 被阅读0次

    1.内存管理

    不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,某些编程语言可以自动帮我们管理内存。(因为内存资源是有限的)

    不管是以什么样的方式来管理内存,内存的管理都会有如下的生命周期

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

    不同的编程语言对于第一步和第三步会有不同的实现:

    • 手动管理内存:比如C、C++,都是需要手动申请和释放内存空间的
    • 自动管理内存:比如Java、JavaScript、Python、Swift、Dart等,它们有自动帮助我们管理内存

    2.JS的内存管理

    • javascript会在定义变量时为我们分配内存
    • 但是内存分配方式是一样的嘛?
      • js对于基本数据类型的内存分配执行时,直接在栈空间进行分配
      • js对于复杂数据类型的内存分配时是在堆内存中开辟一片空间,并且将这块空间的指针返回值变量引用:
        11.png
    12.png 13.png
    • 堆结构开辟的空间,在后面不使用时,会自动被js垃圾回收机制回收

    3.JS的垃圾回收(GC)

    因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间

    • 在手动管理内存的语言中,我们需要通过一些方式自己来释放不再需要的内存,比如free函数

      • 但是这种管理方式是非常低效的,影响我们编写逻辑的代码的效率
      • 并且这种方式对开发者的要求非常高,并且一不小心就会产生内存泄露
    • 所以大部分现代编程语言都有自己的垃圾回收机制

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

    3.1 常见的GC算法——引用计数

    堆空间有一个属性的retain count:默认是0,多一个引用+1,少一个引用-1

    如果对象开辟在堆结构开辟的空间后,在栈结构中会引用,所以堆空间的属性retain count为1

    • 它会将引用为0的对象回收

    这个算法有一个很大的弊端就是会产生循环引用

    14.png

    3.2 标记清除

    • 这个算法会设置一个根对象(root Object),垃圾回收器会从根对象开始,找所有从根开始有引用到的对象,对于那些没有被引用到的对象,就认为是不可用对象。

    • 这个算法可以很好的解决循环引用的问题

    15.png
    • 红色是可到达的部分
    • 黄色是不可到达的部分

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

    4.总结

    内存管理.png

    相关文章

      网友评论

        本文标题:JS 内存管理 GC算法

        本文链接:https://www.haomeiwen.com/subject/gvhxertx.html