常见javascript 中内存泄漏的几种情况

1、什么是内存泄漏?
在程序中,由于疏忽或者错误,造成程序内存被占用而一直没有被释放从而失去控制,从而造成内存的浪费

2、垃圾回收机制
我的理解:在javascript中是有负责自动管理内存的机制的东西,我们称这种管理叫做垃圾回收机制管理,而且垃圾回收机制管理是自动进行的,是不可见的,我们平时所创建的基本类型、对象、函数...所有这些都需要内存,而这些内存的自动化管理和释放都需要 垃圾回收来管理。

所以垃圾回收机制它会管理哪些条件的内存呢?总的来就是那些 不可访问 的对象,进行回收释放;说不可访问,我们可以去理解以下可以访问的对象具有的特点就是:可达,比如:
1、一些基本的固有值,显而易见的
全局变量、函数内部变量和参数、调用其他函数的变量或参数,这些都是可达的,js引擎不会自动释放这些内存;
2、相互引用的对象之间,比如:
局部对象引用其他对象,那么该对象和其引用对象都是可达的。

3、垃圾回收机制常见策略
1、标记清除:比较常用的策略,它是指:在变量标记为“离开环境”时,被清除释放,当变量进入环境时标记为“进入环境”,在标记为“进入环境”时,不能释放内存,因为随时都有可能用到。例如:

var m = 0,n = 19  // 把 m,n,add() 标记为进入环境。
add(m, n)           // 把 a, b, c标记为进入环境。
console.log(n)   // a,b,c标记为离开环境,等待垃圾回收。
function add(a, b) {
  a++
  var c = a + b
  return c
}

上述代码中,调用函数add,里面局部变量c,参数a,b在标记为进入环境时,不能释放,console.log(n)执行后,a,b,c 标记为离开环境,可以回收,但m,n变量不可以释放;

2、引用计数:在js引擎中有一张引用表,保存所有资源的引用次数,如果引用次数是0,表示该值不再引用,则可以释放内存,如果引用次数不为0,那么垃圾回收机制不会释放内存,从而导致内存泄漏,比如:

const arr = [1, 2, 3, 4];
console.log('hello world');

代码中数组[1,2,3,4]是一个值,会占用内存,变量 arr是引用了这个值,因此引用次数为1,尽管后面没有再用到,它仍然可以通过arr找到值,会持续占用内存,也遵循可达性,将会持续占用内存,如果想要回收,则 arr=null,就可以释放;

综上所述,垃圾回收机制虽然会自动释放一些内存空间,但并不代表内存不会泄漏,所以有些变量不再用到,需要检查是否存在对不再用到变量的引用,如果存在,需要手动释放;

常见内存泄漏情况
1、意外使用全局变量,比如函数内部使用全局变量:

function foo(arg) {
    bar = "this is a hidden global variable";
}
或者:
function foo2(){
this.varable = "hello"
}
foo2();//调用后,this指向window全局变量

2、定时器,定时器不清除,一直占用内存,得不到释放,或者在定时器内调用外部函数,得不到释放;
3、闭包,内部函数引用外部函数变量,得不到释放,比如:

function bindEvent() {
  var obj = document.createElement('XXX');
  var unused = function () {
    console.log(obj, '闭包内引用obj obj不会被释放');
  };
  obj = null; // 解决方法
}

4、不清理dom元素的引用,比如:

const refA = document.getElementById('refA');
document.body.removeChild(refA); // dom删除了
console.log(refA, 'refA'); // 但是还存在引用能console出整个div 没有被回收
refA = null;
console.log(refA, 'refA'); // 解除引用

5、监听事件的解除,监听的时候addEventListener,在不监听的时候要使用remveEventListener;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容