资讯专栏INFORMATION COLUMN

JS内存泄露

canopus4u / 2780人阅读

摘要:内存泄漏是指我们已经无法再通过代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。

JS内存泄露

当我们用JS代码创建一个引用类型的时候(以下简称对象),JS引擎会在内存中开辟一块空间来存放数据,并把指针引用交给那个变量。内存是有限的,JS引擎必须保证当开辟的对象没用的时候,把所分配的内存空间释放出来,这个过程叫做垃圾回收,负责回收的叫做垃圾回收器。

内存泄漏是指我们已经无法再通过JS代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。导致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。

以下几种情况会导致内存泄露

绑定事件没有移除

当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

下面这种情况,我们移除input元素之后,但其绑定的事件仍在,垃圾回收器会认为这个对象还是有用的,因此不会回收这个对象,这样就导致当初为这个对象分配的内存无法被释放。

为了避免这种情况的发生,我们可以这样写

innerHTML将对象置为空

用innerHTML将对象置为空时,如果其中的元素被其他引用,也会发生内存泄漏。

尽管我们将divinnerHTML赋值为空,但因为引用p指向div中的p元素,这时垃圾回收器会认为p是有用的,因为被引用着,所以不会回收p占用的内存,导致内存泄漏。

innerHTML

闭包

闭包的重要作用之一就是保持状态

正常情况下,一个函数运行结束,其内部的变量就应该被释放。但下面的情况是,函数outer返回一个匿名函数,这个函数引用变量obj。这样导致函数outer运行结束后,它的变量obj并没有被释放。

function outer(){
    var obj = {name:"xiaoxiong"};
    return function(){
        console.log(obj);
    }
}
意外的全局变量

你可以通过加上"use strict"启用严格模式来避免这类问题, 严格模式会阻止你创建意外的全局变量

函数运行结束,变量仍然存在,导致泄漏。

function work() {
    bar = "this is a hidden global variable";
}

// 上面的函数等价于
function work(arg) {
    window.bar = "this is an explicit global variable";
}

现在我们总结一下,导致内存泄漏的原因大致可以分为两种

函数运行结束,其内部的变量仍存在

我们删除元素,但元素在内存中仍然存在

导致这两种情况的根本原因就是有其他变量引用这些元素。让垃圾回收器认为这个元素还是有用的,因此想避免内存泄漏,我们应该, 要删除一个元素,就要保证在删除这个元素之前,这个元素不被其他其他元素引用(将引用这个元素的指针指向其他元素或置空)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84212.html

相关文章

  • 【拒绝拖延】常见的JavaScript内存泄露原因及解决方案

    摘要:前言内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。这里就讲一些常见会带来内存泄露的原因。解决方案和都设为。 前言 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。这里就讲一些常见会带来内存泄露的原因。 0. 全局变量...

    tangr206 评论0 收藏0
  • vue单页应用的内存泄露定位和修复(一)

    摘要:在前端项目端中,内存泄露的定位往往比修复更加困难,即使浏览器有提供工具,但是面对成千上万的元素和错综复杂的引用关系,开发则依然很难快速定位到问题代码块。 在前端项目(PC端)中,内存泄露的定位往往比修复更加困难,即使google浏览器有提供Memory工具,但是面对成千上万的元素和错综复杂的引用关系,开发则依然很难快速定位到问题代码块。 一、什么是内存泄漏?系统进程不再用到的内存,没有...

    suxier 评论0 收藏0
  • vue单页应用的内存泄露定位和修复(一)

    摘要:在前端项目端中,内存泄露的定位往往比修复更加困难,即使浏览器有提供工具,但是面对成千上万的元素和错综复杂的引用关系,开发则依然很难快速定位到问题代码块。 在前端项目(PC端)中,内存泄露的定位往往比修复更加困难,即使google浏览器有提供Memory工具,但是面对成千上万的元素和错综复杂的引用关系,开发则依然很难快速定位到问题代码块。 一、什么是内存泄漏?系统进程不再用到的内存,没有...

    solocoder 评论0 收藏0
  • 详解js闭包

    摘要:但闭包的情况不同嵌套函数的闭包执行后,,然后还在被回收闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗。每个函数,不论多深,都可以认为是全局的子作用域,可以理解为闭包。 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会...

    Chiclaim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<