美文网首页
js内存泄露

js内存泄露

作者: yongningfu | 来源:发表于2017-03-24 22:47 被阅读0次

js内存泄露

js内存的机制

  1. js的基本变量 boolean string number null undefined symbol 是分配在栈上的
  2. js的引用类型是分配在堆上面的
  3. 内存泄露只会发生在对堆区

js内存回收机制

js是用标记清楚法,部分Ie低版本使用引用计数法进行垃圾回收

上面叫内存泄露呢?

内存泄露就是 内存泄漏是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它 上面这句话就说成了内存泄露的根本

下面分析一段内存泄露的代码

      var demo = document.getElementById('demo');;
      var username = {name: 'username'}; //在堆上面生成一个对象
      demo.onclick = function() {
        this.innerHTML = username.name; //这里面对username进行引用
      }
      username = null; //username 置为空      var demo =    document.getElementById('demo');;
      var username = {name: 'username'}; //在堆上面生成一个对象
      demo.onclick = function() {
        this.innerHTML = username.name; //这里面对username进行引用
      }
      username = null; //username 置为空

上面的代码发送内存泄露了么?
确实是发生了, onclick函数里面引用username, js解析器会标记这个堆地址在onclick里面会有引用, 虽然最后我们设置username = null, onclick里面的标记并没有清楚,即我们无法通过代码进行引用到之前创建的username对应的堆的这个地址,也无法清楚js解析器标记的,onclick里面对这个堆地址的引用。所以发生内存泄露

那如何才能避免发生这样情况呢? 有两种,一种是保证 这个堆地址能被我们js代码控制,另外一个的话,由于是onclick发生泄露,所以我们可以 设置 onclick = null

再来看另外一个情况

function bindEvent() 
{ 
    var obj = document.createElement("XXX"); 
    obj.onclick = function(){ 
        // ... 
    } 
}

bindEvent();

上面的发送泄露了么? 发生了,注意是这个dom上面的onclick函数比较特殊,它会把
onclick函数注册到外面去,相当于闭包暴露在外面了,所以bindEvent会创建一个闭包,而且对于里面生成的的obj,我们是无法引用的到的,所以发生了内存泄露

参考: js的闭包和回调到底怎么才会造成真的内存泄漏呢?

相关文章

  • js内存泄露

    js内存泄露 js内存的机制 js的基本变量 boolean string number null undefin...

  • JS内存泄露

    系统进程不再用用到的内存,没有及时释放,就叫做内存泄露(memory leak)。 当内存占用越来越高,轻则影响系...

  • 加载webView 内存泄露 导致内存暴涨的几种解决方案

    转自:iOS_Cloud的博客** 加载webView导致内存泄露的原因是:Html中的js代码会引起内存泄露 *...

  • 内存泄露

    什么是内存泄露 内存泄露:应用程序分配某段内存后,由于设计错误,失去了对某段内存的控制,因此造成了内存的浪费 js...

  • 内存泄露系列文章(一) - 内存泄露原因及影响

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • 内存泄露系列文章(三) - 内存泄露解决方案

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • js内存泄露总结

    什么是内存泄露 应用程序不再需要占用内存的时候,由于某些原因,内存没有被操作系统或者可用内存池回收。 javasc...

  • JS 内存泄露排查

    在后台在管理界面直接编辑 JS,类是于于下面这些 ${data} 就是动态的数据,到前端之前会做替换。然后每次 a...

  • 内存溢出与内存泄露

    目录 [TOC] 1 内存泄露与内存溢出的区别 1.1 内存泄露 内存泄露(Memory Leak),指的是堆内存...

  • 2019年前端面试题-02

    JS哪些操作会造成内存泄露 JS的回收机制: 找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,...

网友评论

      本文标题:js内存泄露

      本文链接:https://www.haomeiwen.com/subject/hrdqottx.html