美文网首页
js中的内存泄漏

js中的内存泄漏

作者: 小蜗牛的碎碎步 | 来源:发表于2019-11-11 13:53 被阅读0次
基本概念

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

常用场景
  1. 意外的全局变量(作为window对象的属性存在,不会被收回)
a = hello;//未声明的变量->全局变量。

通过this意外创建的全局变量

function my() {
    this.name="my name is tokey"
}
my();//此时的this指向window对象,相当于给window对象添加了属性
console.log(window.name) 
  1. console.log
    作为前端平时使用console.log在控制台打出相对应的信息可以说是非常常见。但如果没有去掉console.log可能会存在内存泄漏。因为在代码运行之后需要在开发工具能查看对象信息,所以传递给console.log的对象是不能被垃圾回收。
  2. 闭包
    //函数置空
function createComparisonFunction(propertyName){
  return funtion(object1,object2){
    var value1 = object1[propertyName];
    var value2 = object2[propertyName];
    ....
  }
}
//创建函数
var compareNames = createComparisonFunction("name");
//调用函数
var result = compareNames();
//必须手动解除对函数的调用否则会造成内存泄漏
compareNames = null;

DOM元素置空(闭包的作用域中保存着html元素)

//更改前
function handel(){
   var element = document.getElementById("myId");
   element.onclick = function(){
    alert(element.id); //对element的引用,造成内存泄漏
  }
}
//更改后
function handel(){
   var element = document.getElementById("myId");
   var id = element.id;
   element.onclick = function(){
    alert(id); 
  }
 element = null;//解除对element的引用,内存被回收
}

由于闭包会携带包含其包含函数的作用域,因此会比其它函数占用更多的内存,过度使用闭包可能会导致内存占用过多。

  1. DOM泄漏
    情况一:空事件处理程序(dom元素被删除,但是事件未被清理)
<div id="myDiv">
    <button value="点击" id="myBtn"></button>
</div>
<script>
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
    document.getElementById("myDiv").innerHTML = "按钮被文字替换了。。。"; // 元素被删除,但是事件未被清理掉
  }
//改进
 btn.onclick = function(){
    btn.onclick = null; //事件清空
    document.getElementById("myDiv").innerHTML = "按钮被文字替换了。。。"; // 元素被删除,但是事件未被清理掉
  }
</script>

情况二:卸载页面时
如果在页面被卸载之前未能清理干净事件处理程序,他们就会滞留在内存中,每次加载完页面再卸载页面时(可能是在两个页面间来回切换,也可能是点击了刷新按钮),内存中滞留的对象数目就会增加,因为事件处理程序占用的内存并没有被释放。
一般来说,最好的做法是在页面卸载之前,先通过onunload事件处理程序移除所有事件处理程序。

  1. 被遗忘的定时器
    js中常用的定时器setInterval()、setTimeout().他们都是规定延迟一定的时间执行某个代码,而其中setInterval()和链式setTimeout()在使用完之后如果没有手动关闭,会一直存在执行占用内存,所以在不用的时候我们可以通过clearInterval()、clearTimeout() 来关闭其对应的定时器,释放内存。

相关文章

  • js中的内存泄漏

    基本概念 由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段...

  • JavaScript中的垃圾回收和内存泄漏

    JavaScript中的垃圾回收和内存泄漏 摘要: JS内存管理。 作者:浪里行舟 Fundebug经授权转载,版...

  • 2018-03-16

    什么是内存泄漏 内存泄漏是指一块被分配的内存既不能被使用又不能被回收,直到浏览器的进程结束。 JS中的垃圾回收机制...

  • Android 中常见的内存泄漏总结

    在 Android 开发中,稍有不慎就容易引起内存泄漏,我们经常听到内存泄漏,但是什么是内存泄漏呢? 内存泄漏:无...

  • JS内存泄漏

    内存泄漏——不再用到的内存,没有及时释放 垃圾回收机制 引用计数:当一个值的引用次数为0时,就表示这个值不再用到了...

  • JS 内存泄漏

    什么是内存泄漏? 不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。 大多数语言提供自动内存...

  • A1_内存泄漏(循环引用)

    一、什么是内存泄漏,在 Obj-C 中如何检测内存泄漏? “内存泄漏(Memory Leak)是指程序中己动态分配...

  • JS的内存泄漏垃圾回收

    一.垃圾回收 JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃...

  • 前端面试-JS垃圾回收机制

    什么是垃圾回收机制? JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在...

  • 安卓内存泄漏

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...

网友评论

      本文标题:js中的内存泄漏

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