问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

潜在的内存泄露

发布网友 发布时间:2024-09-27 21:55

我来回答

1个回答

热心网友 时间:2024-10-17 19:43

引言

什么是内存泄露?

系统进程不再用到的内存,没有及时释放,就叫做内存泄漏(memoryleak).当内存占用越来越高,轻则影响系统性能,重则导致进程崩溃.站在前端的视角.写的不好的JavaScript可能出现难以察觉且有害的内存泄露问题:

白屏/黑屏

卡顿/页面加载迟缓

闪退/发热

?

哪些操作会造成内存泄露

一、意外声明全局变量

意外声明全局变量是最常见但也最容易解决的内存泄露问题.在window上创建的属性,只要window本身不被清除就不会消失.无法做到有效地释放清除

代码编写

functiont(){name='renlingxin'}//name变量会挂在到window上而window上的变量在窗口关闭或重新刷新页面之前并不会销毁//用letconstvar代替

其他挂载

插件/业务场景中有时会通过挂载到window的属性实现运行环境下不同工程之间地相互通信例如

WebView/JavaScript

Cocos/JavaScript

SDK-A/SDK-B

...

我们需要合理正确的挂载.避免挂载大体积的数据.

二、闭包

functiond(){letname='renlingxin'returnfunctionr(){console.log(name)}}//这会导致分配给name的内存被泄露.如果name很大.就会是一个大问题.

三、定时器(做到及时的clear)

保持良好的代码习惯.

<template><div>{{timeDom}}</div></template><script>mounted(){this._time=setInterval(()=>{this.timeDom=newDate()},1000);},//beforeDestroy销毁之前的定时器beforeDestroy(){clearInterval(this._time)}</script>

四、事件*(例如vue的eventBus)

importeventBusfrom'./eventBus'exportdefault{mounted(){//添加eventBus*eventBus.$on('page-change',()=>{console.log('page-changetriggered!')})},beforeDestroy(){//移除eventBus*eventBus.$off('page-change')}}

五、变量和变量/变量和Dom相互引用

我们来看一个例子:

在控制台执行node--expose-gc

>process.memoryUsage(){rss:143835136,heapTotal:5054464,heapUsed:3446128,external:1668772,arrayBuffers:9917}>lety=newArray(5*1024*1024)//1.创建一个5*1024*1024大小的数组undefined>letg={d:y,g:'renlingxin'}//2.设置g中的key-d值为y建立强引用关系undefined>process.memoryUsage()//3.查看当前内存为43.48M左右{rss:325320704,heapTotal:47263744,heapUsed:45596216,external:1668828,arrayBuffers:9933}>y=g.d=null//4.将y和g.d设置null解除引用关系null>global.gc()//5.手动触发一次gc回收undefined>process.memoryUsage()//6.内存缩小至3.02M左右{rss:140541952,heapTotal:5316608,heapUsed:3171248,external:1668812,arrayBuffers:9917}

以上我们可以得出结论变量之间的相互引用以及主动释放引用关系从而触发GC回收的重要性

可以使用weakMap/weakSet建立弱引用关系

>process.memoryUsage()//1.操作之前查看初始内存大小约为3.28M{rss:144654336,heapTotal:5054464,heapUsed:3447472,external:1668772,arrayBuffers:9917}>lett=newWeakMap()//2.新建WeakMapundefined>lety=newArray(5*1024*1024)//3.新建5*1024*1024的数组undefined>t.set(y,'333')//4.设置y至WeakMap//WeakMap{<itemsunknown>}>process.memoryUsage()//5.当前内存大小约为43.22M{rss:329957376,heapTotal:47001600,heapUsed:45320184,external:1668824,arrayBuffers:9929}>global.gc()//6.主动触发gc回收undefined>process.memoryUsage()//7.内存无变化{rss:332529664,heapTotal:47263744,heapUsed:45110040,external:1668812,arrayBuffers:9917}>y=null//8.将y原始值清空为null.但是这里我们并没有去清空t中的ynull>global.gc()//9.释放内存undefined>process.memoryUsage()//10.查看内存大小约为3.07M{rss:161005568,heapTotal:5316608,heapUsed:3227656,external:1668815,arrayBuffers:9920}

六、console(浏览器会记忆输出的变量。避免在线上环境打印)

uglifyjs-webpack-plugin/transform-remove-console...等方法都可以实现移除log

调试工具

一、Performance

全面的性能监控工具

名词解释

Summary:各指标时间占用统计报表

Bottom-Up:事件时长排序列表

Calltree:事件调用顺序列表

EventLog:事件发生的顺序列表

Ps:当你的JsHeap有了这样的走势.那么就会有内存泄露的风险

二、Memory

快照功能

开始拍照

全部删除

功能:

Summary(概要)-通过构造函数名分类显示对象;

Comparison(对照)-显示两个快照间对象的差异;

Containment(控制)-可用来探测堆内容;

Constructor(构造函数)表示所有通过该构造函数生成的对象

Distance到GCroots(GC根对象)的距离。GC根对象在浏览器中一般是window对象,在Node.js中是global对象

Shallowsize列显示了由对应构造函数生成的对象的shallowsizes(直接占用内存)总数---对象自身的大小,不包括它引用的对象单位是字节

Retainedsize列展示了对应对象所占用的最大内存----对象自身的大小和它引用的对象的大小,即该对象被GC之后所能回收的内存大小。单位是字节

内存类型

Compiledcode编译代码

closure闭包

HTMLDivElement、HTMLAnchorElement、DocumentFragment等等这些其实就是你的代码中对元素的引用或者指定的DOM对象引用...

三、Performancemonitor

实时监控工具.参考指标有JavaScript内存/CPU占用率/DOM节点/事件监听...

结论

内存泄露这个话题在前端提及的频率不是很多,大多数的业务场景是简单的页面h5的开发,但对于逻辑复杂/沉淀多/动画丰富等场景内存管理便尤其重要,并且造成内存泄露的原因很多是积少成多的问题叠加,造成积重难返的境遇,因此需要我们从日常写码中重视内存管理。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 包头市流动人口有多少 三国挂机英雄百度版安卓APK 2023衡南县中考录取分数线公布 ...精锐教育联合创始人胡国志联合创办一个家教平台,有谁用过?_百度知... 上海鸿儒教育信息咨询有限公司上海鸿儒教育信息咨询有限公司文化 家教项目是不是要注册公司或什么的,不知道需要多少资金? 我想办一个家教培训班,应该怎么办?? 茶叶蛋怎么煮又快又入味 区块链安全计算技术有哪些(区块链安全计算技术有哪些类型) fil矿机一天可以挖多少币? 燃气灶不打火一直哒哒哒响 燃气灶有哒哒声但是不点火怎么办? ...不多很零散 在北方也不潮。。。是什么虫子? 霉虫有哪些 ...2100显卡 蓝宝石HD6790 1G 技嘉 GA-H61M-D2P-B3 这样子配不会有什 ... 求3000元电脑主机配置,主要用来运行大型绘图软件 谢谢 显示器想配款... CPU用i3 2100,主板用技嘉H61的,显卡配什么好啊,还有电源用哪个啊_百度... I3 2100 配什么主板好,犹豫不决。 华硕P8H61-M LE 460元和技嘉GA-H61M-D2P-B3 560元哪个好,具体有什么... 我上班是早上8点半,下班是5点半,然后朋友叫我去他的咖啡厅帮忙,从6.30... ~~~外地人去哈尔滨游玩,去那些有特色的地方?~~~ ...斯大林公园,太阳岛,还有哪里是外地人值得去的地方? 罗技g502g9键是啥意思 区块链大佬是哪个国家的(区块链第一人是谁) 《加油大魔王.千年之章》14话的题图 飒漫画加油大魔王蜜丽脱衣服那集 飒漫画《加油大魔王》单行本,这是第几本的海报? 七开头的四字成语有哪些 热切割种类 热切割的历史 人吃点儿什么水果能接百毒的东西夏天 乐府双璧指什么??? 增值电信服务有哪些 我父亲在事业单位干了20多年被辞退了,就因为是临时工,他真的不能得到... 北京大学第六医院简介 我带孩子到北京大学第六医院看精神料需要什么证件吗? 精神病学专科哪家强?且看最新医院排行榜 串越多倍率越高吗 4串1有一场输一半 4串3和4串1哪个奖金多