关于前端:面试js-内存管理

3次阅读

共计 748 个字符,预计需要花费 2 分钟才能阅读完成。

1. 内存治理

  • 分配内存:挖坑 ,要依据不同的类型调配不同的内容

    • js 根底类型:string、number、boolean、undefined、null、symbol。占用空间大小固定、体积轻量。放在栈内存中存储。
    • js 简单类型:Object。占用空间大小不固定。放在堆内存中存储。
  • 读写内存:用坑

    • js 根底类型:获取时间接从栈中取走变量的值。
    • js 简单类型:获取时,先从栈内存中获取对象的援用(堆内存中的地址),而后再去堆内存中查问,拿到具体的数据。
  • 开释内存:还坑 ,垃圾回收

    • 援用计数法:

      • 古代浏览器曾经不必这种了
      • 内存中每一个变量都对应一个援用计数,当计数为 0 的时候开释内存
      • 存在的问题:无奈删除循环援用的对象,容易引起内存透露
    • 标记革除法:

      • 从 window 对象开始,扫描所有能够通过根对象触达的变量,这些对象被标记为‘可触达’。
      • 遍历所有对象革除没标记的对象,并将标记复原到默认。
      • 回收相应的空间
      • 毛病:回收的对象在地址上是不间断的,导致空间尽管被回收了,然而不间断,导致后续调配空间的不好应用,而节约空间。而且不会立刻回收垃圾对象
    • 标记整顿法:

      • 标记阶段是一样的;
      • 革除之前会先整顿空间,挪动地位,使被开释的空间在一个间断的空间。
      • 新生代(存活工夫短,占比小)+ 老生代。新生代(from + to),存活的从 from 移到 to,不存活的开释;而后调换地位;如果 to 中超过 25%,则放到老生代。老生代:将活的挪动到一侧;革除边界外的所有;
    • 在理论中还做了一些优化:

      • 遍历一次对象的耗时可能比拟久,在执行时存在肯定的提早。所以引擎会将垃圾回收合成为几个局部,各个局部别离执行,减小提早。
      • 为了缩小对执行的影响,垃圾回收只在 CPU 闲暇的时候运行

    2. 内存透露

  • 意外的全局变量
  • 没有革除 setInterval、间断的 setTimout
  • 没有删除对 DOM 的援用
正文完
 0