iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >浅谈JavaScript中内存泄漏的几种情况
  • 780
分享到

浅谈JavaScript中内存泄漏的几种情况

JavaScript内存泄漏 2023-05-18 05:05:59 780人浏览 安东尼
摘要

目录一、内存泄漏是什么?二、垃圾回收机制1、标记清除2、引用计数三、常见的内存泄漏的情况1、意外的全局变量2、定时器造成的内存泄露3、闭包4、没有清理对DOM元素的引用5、事件监听(

一、内存泄漏是什么?

内存泄漏(Memory leak)是再计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。

并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

程序的运行需要内存。只要程序提出要求,操作系统或者运行时就必须供给内存。

对于持续运行的服务进程,必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。

C语言中,因为是手动管理内存,内存泄露是经常出现的事情。

char * buffer;
buffer = (char*) malloc(42);
// Do something with buffer
free(buffer);

上面是 C 语言代码,malloc方法用来申请内存,使用完毕之后,必须自己用free方法释放内存。

这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制"

二、垃圾回收机制

javascript 具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存

原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存

通常情况下有两种实现方式:

  • 标记清除
  • 引用计数

1、标记清除

JavaScript最常用的垃圾收回机制

当变量进入执行环境是,就标记这个变量为“进入环境“。进入环境的变量所占用的内存就不能释放,当变量离开环境时,则将其标记为“离开环境“

垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉

在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了

随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存

代码如下(示例):

var m = 0,n = 19 // 把 m,n,add() 标记为进入环境。
add(m, n) // 把 a, b, c标记为进入环境。
console.log(n) // a,b,c标记为离开环境,等待垃圾回收。
function add(a, b) {
  a++
  var c = a + b
  return c
}

2、引用计数

语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放

如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏

代码如下(示例):

const arr = [1, 2, 3, 4];
console.log('hello world');
// arr = null

上面代码中,数组[1, 2, 3, 4]是一个值,会占用内存。变量arr是仅有的对这个值的引用,因此引用次数为1。尽管后面的代码没有用到arr,它还是会持续占用内存。

如果需要这块内存被垃圾回收机制释放,只需要再次将arr设置为null,就解除了对数组[1,2,3,4]的引用,引用次数变为 0,就被垃圾回收了。

小结

有了垃圾回收机制,不代表不用关注内存泄露。那些很占空间的值,一旦不再用到,需要检查是否还存在对它们的引用。如果是的话,就必须手动解除引用。

三、常见的内存泄漏的情况

1、意外的全局变量

// 不设置定义变量的方法默认为var
function foo(arg) {
    bar = "this is a hidden global variable";
}
// 另一种意外的全局变量可能由 this 创建:
function foo() {
    this.variable = "potential accidental global";
}
// foo 调用自己,this 指向了全局对象(window)
foo();

上述使用严格模式,可以避免意外的全局变量。

2、定时器造成的内存泄露

var someResource = getData();
setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        // 处理 node 和 someResource
        node.innerhtml = JSON.stringify(someResource));
    }
}, 1000);

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

3、闭包

function bindEvent() {
  var obj = document.createElement('XXX');
  var unused = function () {
    console.log(obj, '闭包内引用obj obj不会被释放');
  };
  obj = null; // 解决方法
}

维持函数内局部变量,使其得不到释放

4、没有清理对DOM元素的引用

const refA = document.getElementById('refA');
document.body.removeChild(refA); // dom删除了
console.log(refA, 'refA'); // 但是还存在引用能console出整个div 没有被回收
refA = null;
console.log(refA, 'refA'); // 解除引用

5、事件监听(addEventListener)

包括使用事件监听addEventListener监听的时候,在不监听的情况下使用removeEventListener取消对事件监听

总结

到此这篇关于浅谈JavaScript中内存泄漏的几种情况的文章就介绍到这了,更多相关JavaScript 内存泄漏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈JavaScript中内存泄漏的几种情况

本文链接: https://www.lsjlt.com/news/211645.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈JavaScript中内存泄漏的几种情况
    目录一、内存泄漏是什么?二、垃圾回收机制1、标记清除2、引用计数三、常见的内存泄漏的情况1、意外的全局变量2、定时器造成的内存泄露3、闭包4、没有清理对DOM元素的引用5、事件监听(...
    99+
    2023-05-18
    JavaScript 内存泄漏
  • JavaScript中内存泄漏的几种情况总结
    目录1.循环引用2.定时器未清除3.DOM元素未正确删除4.全局变量未清除5.闭包未正确使用6.事件未正确解绑7.大量数据未及时清理8.使用了第三方库或框架JavaScript 中的...
    99+
    2023-05-19
    JavaScript发生内存泄漏情况 JavaScript内存泄漏解决方法 JavaScript内存泄漏
  • 浅谈QT内存泄漏
    目录01前言02 QT半自动化内存管理要点03实验过程详解Malloc分配的内存空间实践实例04总结01前言    前几天,项目开展了一次代码初次评审。会上,领导...
    99+
    2024-04-02
  • JavaScript内存泄漏的情况是怎样的
    这期内容当中小编将会给大家带来有关JavaScript内存泄漏的情况是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、意外的全局变量。function foo(arg) {&n...
    99+
    2023-06-25
  • JavaScript中引发内存泄漏的情况有哪些
    JavaScript中引发内存泄漏的情况有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript的特点1.JavaScript主要用来向HTML页面添加交互...
    99+
    2023-06-14
  • 浅谈C++类型转换几种情况
    目录0. 类型转换的原理1. 初始化和赋值时进行的转换2. 以{}方式初始化时进行的转换(C++11新增)3. 表达式中的转换4. 传递参数时的转换5. 强制类型转换6. 使用aut...
    99+
    2024-04-02
  • golang容易导致内存泄漏的6种情况汇总
    目录1. 定时器使用不当1.1 time.After()的使用1.2 time.NewTicker资源未及时释放2. select阻塞2.1 导致goroutine阻塞的情况2.2 ...
    99+
    2023-01-09
    golang内存泄漏例子 go 内存泄漏 golang内存泄漏场景
  • Java中什么情况会导致内存泄漏
    这篇文章主要讲解了“Java中什么情况会导致内存泄漏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中什么情况会导致内存泄漏”吧!概念内存泄露:指程序中动态分配内存给一些临时对象,但对...
    99+
    2023-06-16
  • 浅谈Node的内存泄露
    目录1、node内存相关知识2、哪些情况会造成内存泄露第一、全局变量第二、函数闭包第三、事件监听3、内存泄露的监测4、Chrome DevTools进行分析和对比5、内存分析的意义1...
    99+
    2024-04-02
  • Android项目中哪些情况会出现内存泄漏
    今天就跟大家聊聊有关Android项目中哪些情况会出现内存泄漏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、单例造成的内存泄漏Android的单例模式非常受开发者的喜爱,不过使用...
    99+
    2023-05-31
    android 内存泄漏 roi
  • 浅谈Redis阻塞的9种情况
    目录命令阻塞SAVE 阻塞同步持久化AOF 重写AOF 日志大 Key 问题查找大 key删除大 key清空数据库集群扩容前两天去美团面试的陈同学回来了,看他满脸泄气的样子,准是没拿到 Offer。 听了他面试的经过,真...
    99+
    2023-03-24
    Redis 阻塞
  • 浅谈mysql增加索引不生效的几种情况
    增加索引可以提高查询效率。 增加索引就是增加一个索引文件,存放的是数据的地址,类似与我们文档的目录,在查找过程中可以不用从书的内容查找,直接根据目录对应的页码查找。索引是根据地址查找...
    99+
    2024-04-02
  • Android开发中什么情况下会出现内存泄漏
    今天就跟大家聊聊有关Android开发中什么情况下会出现内存泄漏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 android中一个对象已经不需要了,但是其他对象还持有他的...
    99+
    2023-05-31
    android 情况下 roi
  • JavaScript中的内存泄漏的原因
    目录前言内存泄漏的场景全局变量闭包DOM元素引用总结前言 JavaScript的内存泄漏指的是一些不再需要的对象仍然占用着内存,导致内存使用量持续增加,甚至造成浏览器崩溃或性能下降。...
    99+
    2023-05-18
    JavaScript 内存泄漏
  • JavaScript中内存泄漏怎么办
    这篇文章主要介绍JavaScript中内存泄漏怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是内存泄漏?程序的运行需要内存。只要程序提出要求,操作系统或者运行时(run...
    99+
    2024-04-02
  • JavaScript中内存泄漏的示例分析
    这篇文章主要介绍了JavaScript中内存泄漏的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、识别方法chrome在performance中查看。开启开发工具P...
    99+
    2023-06-15
  • JavaScript中内存泄漏指的是什么
    内存泄漏是指程序中一个对象被分配到内存中既不能使用,又不能回收,留在了堆内存中就称为内存泄漏,当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,...
    99+
    2024-04-02
  • JavaScript中怎么防范内存泄漏
    这篇文章给大家介绍JavaScript中怎么防范内存泄漏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。浏览器将对象保留在堆内存中,通过引用链可从根对象到达这些对象。垃圾回收器(GC)是...
    99+
    2024-04-02
  • javascript中怎么防止内存泄漏
    小编给大家分享一下javascript中怎么防止内存泄漏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • Java 中的内存泄漏
    什么是 Java 中的内存泄漏? 当应用程序持有不再需要的对象引用时,就会发生 Java 内存泄漏。这些意外的对象引用阻止内置的 Java 垃圾收集机制释放这些对象消耗的内存,最终导致致命的OutOfMemoryError。 简而言之,...
    99+
    2023-10-11
    java jvm 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作