精华内容
下载资源
问答
  • JS内存泄漏

    2019-01-14 17:21:22
  • js内存泄漏

    2017-10-09 14:06:34
    js内存泄漏

    如果一段内存中的数据不再使用,但也无法释放,就发生了内存泄漏。


    内存何时释放,本质上是由代码本身的逻辑所决定的,主动权在开发人员。js提供的GC(Garbage Collection,垃圾回收),提供两种策略:

    1.  reference counting(引用计数):就是gc会统计内存中数据被引用的次数,当没有变量引用这段内存时(引用数为0),这段内存中的数据就会被释放。

    2. mark & swap (标记清除):就是gc会根据变量的作用域来决定是否需要释放内存。比如,在函数作用域内定义的变量在函数运行完毕后,对应占用的内存就会被释放;全局变量对应的内存则会一直存在,除非手动将其指向(引用)别的内存。


    引发内存泄漏的常见操作?

    1. 全局变量

    我们知道,全局变量占用的内存不会主动释放。所以要避免使用过多的全局变量,将那些在整个程序运行期间都可能会使用到的变量声明为全局的即可。

    有时我们可能“不小心”声明了一个全局变量:

    未声明的变量在函数中直接使用,此变量会被默认为全局变量,比如:

    function foo() {
        a=10;
    }
    等价于

    function foo() {
        window.a=10;
    }

    可加上"use strict"来检查这种意外情况。

    另一种情况是通过this:

    function foo() {
        this.a=10
    }
    foo();
    函数直接调用,this会指向window。如果通过new的方式创建一个对象,则this指向此新对象,不会意外创建新对象。

    2. 被遗忘的定时器

    setInterval和setTimeout是window对象的函数,不清除便会一直存在,其实这也可以归到第1条中去。


    3. 闭包引起的内存泄漏

    outerFunction中被闭包所引用的变量不会被回收


    4. DOM的外引用

    DOM元素在DOM树中存在一个引用,当我们移除或替换这个元素时,只是把DOM树中的引用去除了,如果有其他变量引用了此元素,则仍不会被回收。

    本质上还是因为引用数不为0。


    5. 循环引用

    展开全文
  • js 内存泄漏

    2016-07-08 22:08:02
    dom中引用js () js中引用dom 则很容易有内存泄漏
    dom中引用js (<input οnclick="message()"/>) js中引用dom 则很容易有内存泄漏
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,275
精华内容 510
关键字:

js内存泄漏