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

什么是内存泄漏?

发布网友 发布时间:2022-04-22 10:53

我来回答

2个回答

懂视网 时间:2022-04-22 15:14

内存泄漏指的是当一个对象不起作用时应该被回收时却因为另一个对象对它的引用而导致它不能被回收,留在了堆内存中就称为内存泄漏。常见的有意外全局变量,DOM泄漏以及循环引用等

【推荐课程:JavaScript教程】

内存泄漏

内存泄漏一般指的是当一个对象已经没有作用了应该被回收时,另外一个正在使用的对象因对它的引用从而导致它不能被回收,这个不能被回收的对象停留在了堆内存中,这就造成了内存泄漏

当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏

常见的内存泄漏:

1、意外的全局变量

Js处理未定义变量的方式:未定义的变量会在全局对象创建一个新变量,在浏览器中,全局对象是window。

function foo(arg) { 
bar = "this is a hidden global variable"; //等同于window.bar="this is a hidden global variable"
this.bar2= "potential accidental global";//这里的this 指向了全局对象(window),
等同于window.bar2="potential accidental global"}

解决方法:在JavaScript程序中添加,开启严格模式'use strict',可以有效地避免上述问题。

注意:用来临时存储大量数据的全局变量,在确保处理完这些数据后要将其设置为null或者重新赋值。

2、DOM泄漏

在浏览器中DOM和JS所采用的引擎是不一样的,DOM采用的是渲染引擎,而JS采用的是v8引擎,所以在用JS操作DOM时会比较耗费性能,所以为了减少DOM的操作,我们会采用变量引用的方式会将其缓存在当前环境。如果在进行一些删除、更新操作之后,可能会忘记释放已经缓存的DOM因此造成了内存泄漏

例:对没有清理的DOM元素引用

var refA = document.getElementById('refA');
document.body.removeChild(refA); // #refA不能回收,因为存在变量refA对它的引用。
将其对#refA引用释放,但还是无法回收#refA。

解决办法:设置refA = null;

3、被遗忘的计时器和回调函数

var someResource = getData();
setInterval(function() {
 var node = document.getElementById('Node');
 if(node) {
 node.innerHTML = JSON.stringify(someResource));
 }
}, 1000);

这样的代码很常见, 如果id为Node的元素从DOM中移除, 该定时器仍会存在, 同时, 因为回调函数中包含对someResource的引用, 定时器外面的someResource也不会被释放

4、循环引用

在js的内存管理环境中,如果对象 A 对B有访问对象的权限,就称为对象 A 引用对象 B。引用的计数的策略就是看对象有没有其他对象引用到它,如果没有对象引用这个对象,那么这个对象将会被回收 。

var obj1 = { a: 1 }; // 一个对象(称之为 A)被创建,赋值给 obj1,A 的引用个数为 1 
var obj2 = obj1; // A 的引用个数变为 2 
 obj1 = 0; // A 的引用个数变为 1 
 obj2 = 0; // A 的引用个数变为 0,此时对象 A 就可以被垃圾回收了

但是引用计数有个最大的问题就是循环引用。

function func() { 
 var obj1 = {}; 
 var obj2 = {}; 
 obj1.a = obj2; // obj1 引用 obj2 
 obj2.a = obj1; // obj2 引用 obj1 }

当函数执行结束后,返回值为 undefined,所以整个函数以及内部的变量都应该被回收,但根据引用计数方法,obj1 和 obj2 的引用次数都不为 0,所以他们不会被回收。所以要解决这个问题可以设置它们的值为null

总结:

热心网友 时间:2022-04-22 12:22

内存泄漏
内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
内存泄漏形象的比喻是"操作系统可提供给所有进程的存储空间正在被某个进程榨干",最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以"内存泄漏"是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
步法追踪三、步法追踪的三个发展阶段 步法追踪四、我国足迹检验技术的现状及特点 世上真有魂魄吗? 一个人死啦,他的魂魄还在吗,他有可能变成鬼吗 煤气罐老是打不开还得用打火机,点着,有危险吗? 世界杯英格兰2-1突尼斯哪些球员进球? 张环演了多少个角色 忠肝义胆却小人,肆无忌惮不要惧 我本沉默完整攻略,就是哪个玩法! 山东滨州的气候与哪些城市相似? 温州现在大酒店可以办结婚了吗? 著名的商业街五马街以前是不是一条河? 温州市2022年四月份大酒店摆喜酒鹿城区可以摆吗有没有文件 如何投资入股温州香格里拉大酒店 温州香格里拉大酒店的介绍 冒险岛在哪换小公主的发型几率大 温州国际大酒店 住一晚要多少钱。 冒险岛皇家发型中小公主发型的几率是多少?拜托各位了 3Q 石狮温州大酒店有什么好玩的? 温州有哪些星级的大酒店? 铜仁市温州大酒店有限公司怎么样? 女生进入(女生多大戴胸罩才合适?) ps在面板上做的,怎么导出图片 种植大蒜有风险吗 一位寒心如苦的农民种植的大蒜一年的收成将毁于一旦。。蒜苔丰收前这 种植的大蒜土壤长许多绿苔,大蒜死亡严重,今年种植有办法改善吗? 大蒜种植过程中使用的大量农药,又没有残留?蒜农浇地直接把农药灌进去。我们吃得留意 是什么样的 微信5.3.1版本怎么样,和之前版本比有没有什么用起来不便的地方? word里页码不连续怎么设置页码 紫苏叶能治拉肚子吗 韩文输入法软件下载哪儿有 怎么修改? 一年没满 想更改怎么更改? 可以怎么改? 苹果手机怎么更新 如何更改自己的 一年没满 想更改怎么更改 怎么更改自己的? 怎样可以更改 VlPERHiFi软件下载的歌曲怎样转到其他音乐软件 怎么更改 怎么更改 怎么更改? 微信怎样可以改 UNI-T车机微信怎么更新 微信下面的怎么更改呢 已注册的怎样更改 怎样更改? 怎么修改