文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JS前端的内存处理的方法是什么

2023-07-06 00:36

关注

这篇文章主要介绍了JS前端的内存处理的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS前端的内存处理的方法是什么文章都会有所收获,下面我们一起来看看吧。

一、内存的储存和代码执行的场所关系

对于任何语言来说,内存管理、垃圾回收等知识都是进阶路上绕不开的坎。出来面试估计也没少被问到“前端的内存处理你了解么? 你知道js中的垃圾处理机制吗? 什么情况会导致内存泄漏呢?

1. 储存空间

两种结构:

为什么不都用栈存呢?

因为需要用栈来维护程序执行期间上下文的状态,如果栈空间大了话,所有的数据都存放在栈空间里面,那么会影响到上下文切换的效率,进而又影响到整个程序的执行效率。

2. 内存的生命周期

内存分配:声明变量、函数、对象的时候 内存的使用:读写内存,使用变量 函数等 内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存

3. js 中的内存分配和使用

// 分配const num = 123;  // 分配到栈const str = 'sss';// 分配到栈const obj = {};   // 分配到堆// 使用const a = 10;console.log(a); // 使用

4. 调用栈下移ESP(记录当前执行状态的指针)

当一个函数执行结束之后,JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文。 比方下面这个例子通过ESP 状态来展示就如图所示。

var foo1 = () => {    console.log('foo1')    foo2()}var foo2 = () => {    console.log('foo2')}foo1()

JS前端的内存处理的方法是什么

被ESP指针移开后的函数作用域foo1 明显属于不在被引用,后续将会直接被GC回收

二、 js中的垃圾回收机制

有C语言经验的开发者,一定明白内存声明分配好之后,需要手动 free 的操作,这就是手动回收。而 Js 本身是自动回收机制,所以开发者不需要过多关注内存分配和释放的问题。这些工作都让 V8 引擎中的垃圾回收器(GC)给承包了。

最早接触 js 的时候,市面上对于 js 内存管理、垃圾回收主要讲的是下面两种概念:

1. 引用计数法

引用计数法的算法主要依赖于引用的概念,这个回收机制最早是在 IE 在使用的。目前主流浏览器都使用标记清除法了。看一个对象是否有指向他的引用,如果没有其他对象指向他了,说明当前这个对象不再被需要了。

他的缺陷在于:循环引用

如果两个对象相互引用,尽管他们已不再被使用,但是引用计数无法识别,导致内存泄漏。

2. 标记清除法(Mark-Sweep)

将“不再使用的的对象”定义为“无法到达的对象

从根部js的全局对象触发,定时递归扫描内存中的对象,凡是无法从根部到达的对象,就会被标记为不再使用,稍后进行回收。

执行过程如下:

三、代际假说和分代收集

代际假说(The Generational Hypothesis)是现代浏览器垃圾回收策略的基础。整个模型可以看看下图

JS前端的内存处理的方法是什么

新生代(副垃圾回收器)

存放的是生存时间短、占用空间较小的的对象,通过 Scavenge 算法,是把新生代空间对半划分为两个区域,一半是对象区域,一半是空闲区域。新的对象都要放到对象区,当快满的时候,将还存活的对象复制到空闲区后进行角色互换。并且执行对象晋升策略,对象区域和空闲区域翻转两次还存在的对象,升级到老生代。这个复制翻转的过程也避免内存碎片的产生。

老生代(主垃圾回收器)

存放的生存时间久的对象或者大的对象,使用标记清除的算法进行垃圾回收。一旦执行垃圾回收算法,都需要将正在执行的 JavaScript 脚本暂停下来,待垃圾回收完毕后再恢复脚本执行。这种行为称为全停顿(Stop-The-World)。实际上浏览器为了避免垃圾回收卡顿通过增量标记方式将回收任务拆解成多个小任务穿插在js主线程中执行。

四、常见的内存泄漏

1. 全局变量

function foo() {    bar1 = 'aaa'; // 相当于声明在window.bar1    this.bar2 = 'aaaa'}foo(); // 执行函数事this指向window ,相当于一个函数给全局变量增加了两个变量

2. 未被清理的定时器和回调函数

//setInterval//setTimeoutsetInterval(() => {    console.log('test')}, 500)//没用用 clearInterval clearTimeout 做清除

3. 闭包

个人最喜欢《你不知道的js》里对闭包的描述

一个内部函数,有权访问包含其的外部函数的变量 —— 《你不知道的js》 或者也可以用“内存逃逸”这种高逼格的属于形容。

// 闭包 gc 案例var one = null;var replace = function() {    var originalOne = one;    var unused =function() {        if(originalOne) {            console.log(111);        }    }    one = {        longString: '111',        method: function() {            console.log()        }    }    }setInterval(replace, 500)

每次调用 replace, one 得到一个包含字符串和一个对于新闭包 method 的对象 unused 引用了 originOne

5. DOM 引用

var elements= {    image: document.getElementById('111');}elements.image = null;

6. 怎么避免呢?

//尽可能少写window.object = {} // 这类代码
let obj = {}...obj = null;
// Vue3 中就大量用了WeakMap 优化实例引用const bucket = new WeakMap();...const obj = new Proxy(data, {  get(target, key) {    track(target, key);    return target[key];  },  set(target, key, newVal) {    target[key] = newVal;    trigger(target, key);  },});function track(target, key) {  if (!activeEffect) return;  let depsMap = bucket.get(target);  if (!depsMap) {    bucket.set(target, (depsMap = new Map()));  }  // 再根据key 从 depsMap 中取得 deps, 它是一个 Set 类型,里面存储着左右与当前 key 相关联的副作用函数: effects  let deps = depsMap.get(key);  // 如果 deps 不存在,同样新建一个 Set 并与 key 关联  if (!deps) {    depsMap.set(key, (deps = new Set()));  }  deps.add(activeEffect);  activeEffect.deps.push(deps);}...

关于“JS前端的内存处理的方法是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JS前端的内存处理的方法是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯