zoukankan      html  css  js  c++  java
  • JavaScript中的内存溢出与内存泄漏

    内存溢出

    是一种程序运行出现的错误; 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误

    var obj = {}
    for (var i = 0; i < 100000; i++) {
      obj[i] = new Array(10000000)
    }
    console.log('------')

    内存泄露

    占用的内存没有及时释放; 内存泄露积累多了就容易导致内存溢出

    常见的内存泄露意外的全局变量

    function fn () {
      b = new Array[1000000]
      a = [] //不小心没有var定义,这时候a变量是全局的
    }
    fn()

    常见的内存泄露没有及时清理的计时器或回调函数

    // 没有及时清理的计时器
    var intervalId = setInterval(function  () {
      console.log('----')
    }, 1000)
    
    clearInterval(intervalId) // 及时清理计时器

    常见的内存泄露闭包

    函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长,容易造成内存泄露

    解决办法就是能不用闭包就不用,及时释放

    function fn1() {
      var arr = new Array[100000];
      function fn2() {
        console.log(arr.length)
      }
      return fn2;
    }
    var f = fn1();
    f();
    f();
    f = null // 让内部函数成为垃圾对象,释放闭包

    还有一个就是在IE6,7,8中的问题:由于 IE 的 JScript 对象和 DOM 对象使用不同的垃圾收集方式,因此闭包在 IE 中会导致一些问题。就是内存泄漏的问题,也就是无法销毁驻留在内存中的元素。

    <body>
        <div id="oDiv">Lee</div>
    </body>
    </html>
    <script type="text/javascript">
        function box() {
            var oDiv = document.getElementById('oDiv'); //oDiv 用完之后一直驻留在内存
            oDiv.onclick = function () {
                alert(oDiv.innerHTML);           //这里用 oDiv 导致内存泄漏
            };
        }
        box();
    </script>

    那么在最后应该将 oDiv 解除引用来避免内存泄漏。

    <body>
        <div id="oDiv">Lee</div>
    </body>
    </html>
    <script type="text/javascript">
        function box() {
            var oDiv = document.getElementById('oDiv'); 
            var text = oDiv.innerHTML;
            oDiv.onclick = function () {
                alert(text);
            };
            oDiv = null;       //解除引用,等待垃圾回收
            alert(oDiv);       //null,说明已经不存在了
        }
        box();
    </script>
  • 相关阅读:
    归并排序
    快速排序
    冒泡排序
    排序算法复杂度
    [LeetCode] 20. Valid Parentheses ☆(括号匹配问题)
    makefile编写helloworld
    shell的通俗理解
    PID三种参数的理解
    PID的原理
    PID控制温度
  • 原文地址:https://www.cnblogs.com/LO-ME/p/10823257.html
Copyright © 2011-2022 走看看