美文网首页
内存泄漏和JS垃圾回收机制

内存泄漏和JS垃圾回收机制

作者: my木子 | 来源:发表于2021-04-23 07:53 被阅读0次

内存泄漏(memory leak)

  • 程序的运行是需要分配内存空间的,如果一些不能用到的内存未及时释放无法释放,就会造成系统内存的浪费,导致浏览器卡顿甚至崩溃。
  • 为了防止内存泄漏,所以就需要垃圾回收机制及时释放用不到的内存。

JS垃圾回收机制原理

  • 标记清除:垃圾回收机制在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉处在环境中的变量及被环境中的变量引用的变量标记(闭包)。而在此之后剩下的带有标记的变量被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾回收机制到下一个周期运行时,将释放这些变量的内存,回收它们所占用的空间。
  • 引用计数:垃圾回收器会定期扫描内存,如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。但如果两个变量互相引用时,他们的引用次数永远是2,就存在无法回收的问题。

常见的内存泄漏

  • 全局变量( 避免使用全局变量 )
num = 1;  
console.log( num );
num  = null;
  • 闭包
function f1() {
    var a = 1;
    function f2() {
        console.log(a++);
    };
    return f2
};
var f = f1();
f();
f = null;   //  f 和函数 f2 的联系被切断,f2 不再被引用,因此f2被回收
  • 定时器
let i = 0;
let  t = setInterval(function(){
    i++;
    if(i>3){
        clearInterval(t);
    }
    console.log(i);
},1000);
  • DOM 元素引用
let btn = document.getElementById('btn');
// ...
btn = null;
  • 监听在 window 的事件
window.addEventListener('click', this.fun);
// ...
window.removeEventListener('click', this.fun);

Vue 中容易出现内存泄露的几种情况

  • 清除全局变量
destroyed () {
    window.data = null; // 页面卸载的时候解除引用
}
  • 清除 EventBus 事件
destroyed () {
    EventBus.$off();
}
  • 清除监听在 window 的事件
beforeDestroy () {
  window.removeEventListener('click', this.fun);
}
  • 清除 Echarts 实例
beforeDestroy () {
  this.chart.clear();
}

ES6 防止内存泄漏

  • ES6 考虑到这点,推出了两种新的数据结构:weakset 和 weakmap 。
  • 他们对值的引用都是不计入垃圾回收机制的,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。
const listener = new WeakMap();
const ele = document.getElementById('btn');
listener.set(ele, fun);
ele.addEventListener('click', listener.get(ele), false);

相关文章

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

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

  • 垃圾回收机制

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

  • JS 里垃圾回收机制是什么,常用的是哪种,怎么处理的?

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

  • JS的内存泄漏垃圾回收

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

  • 对 Java 内存的一些理解-[Android_YangKe]

    Java 垃圾回收机制优点 Java 内存模型 什么是内存抖动 什么是内存泄漏 垃圾回收机制常见算法 Java 垃...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • 2018-03-16

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

  • 2018-10-13

    浅谈浏览器的垃圾回收机制和内存泄露 JavaScript使用垃圾回收机制来自动管理内存。 JS的回收机制分两种:1...

  • 2017.11.09正则表达式

    垃圾回收 垃圾回收机制:内存泄漏 垃圾回收/生命周期 正则表达式(规则表达式) Regular Expressio...

  • Android性能优化之内存泄漏

    内存泄漏:内存单元使用完成后未释放,未回收。理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题。 在目前的...

网友评论

      本文标题:内存泄漏和JS垃圾回收机制

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