js内存管理

内存生命周期

1 .分配需要的内存

1 .js自己进行内存分配同时声明值,在解析定义的变量的时候就在分配内存
2 .为数字分配内存
3 .为字符串分配内存
4 .为对象及其包含值分配内存
5 .为数组及其包含的值分配内存
6 .为函数分配内存
7 .为函数表达式分配一个对象  someElement.addEventListener('click',()=>{})
8 .某些方法也会导致对象的内存分配:为日期分配对象,为dom节点分配对象
9 .一些数组或者对象的方法调用也会导致内存的重新分配
10 .

2 .使用内存读写
3 .不需要时将其释放/归还

1 .最难的地方时确定何时不在需要分配的内存,它通常要求开发人员确定程序中哪些地方不在需要内存并释放它
2 .高级语言嵌入了一种垃圾回收机制,跟踪内存分配和使用,一边发现任何一块不需要的已分配内存,并自动释放
3 .

4 .c语言中,有专门的内存管理接口,mallos,free。js中是没有专门的内存管理接口,所有的内存管理都是自动的,js在创建变量时,自动分配内存,并在不使用的时候自动释放

js中的内存回收

1 .引用

1 .垃圾回收算法主要依赖于引用的概念。在内存管理环境中,一个对象如果有访问另一个对象的权限,叫做一个对象引用另一个对象
2 .例如一个js对象具有对他原型的引用,隐式调用,和对他属性的引用,显示调用
3 .循环引用的问题无法解决

2 .引用计数垃圾收集

1 .如果对象没有其他对象引用到他,对象将被垃圾回收机制回收
2 .arr=null
3 .

3 .循环使用

1 .两个对象被创建并相互引用,就造成了循环引用,他们调用之后不会离开函数作用域,现在他们已经没有了作用,可以被回收。但是引用计数算法考虑到他们互相都有至少一次引用,所以他们不会被回收
2 .function f() {
  var o1 = {};
  var o2 = {};
  o1.p = o2; // o1 引用 o2
  o2.p = o1; // o2 引用 o1. 这里会形成一个循环引用
}
f();
3 .实际例子
var div;
window.onload = function(){
  div = document.getElementById("myDivElement");
  div.circularReference = div;
  div.lotsOfData = new Array(10000).join("*");
};

4 .标记-清除算法

1 .对象是否可以获得
2 .假定设置一个叫做根root的对象。定期的,垃圾回收器将从根开始,找所有根开始引用的对象,然后找这些对象引用的对象,从根开始,垃圾回收器将找到所有可以获得的对象和所有不能获得的对象
3 .所有现代浏览器都使用了标记-清除内存回收算法。所有对js垃圾回收算法的改进都是基于标记-清除算法的改进
4 .最后,垃圾收集器释放所有未标记的为活动的内存块
5 .问题:内存回收是不可控制的。当分配一个非常大的数组,数组被标记为不可访问

5 .自动GC的问题

1 .虽然自动GC很方便,但是不知道什么时候GC会进行,这意味着如果我们在使用过程中使用了大量的内存,而gc没有运行的情况下,或者gc无法回收这些内存的情况下,程序就可能假死。所以我们需要在程序中手动做一些操作触发内存回收
2 .内存泄漏:不在被需要的内存,由于某种原因,无法被释放
3 .

常见的内存泄露案例

1 .全局变量:在js中处理未被声明的变量,会被定义到全局对象中去,在浏览器中就是window,在页面中的全局变量,只有当页面被关闭后才会被销毁。所以就会造成内存泄露

function foo(arg) {
    bar = "some text";
}
//此时泄露的只是个字符串。但是实际情况可能更加复杂

2 .意外创建全局变量的情况

function foo() {
    this.var1 = "potential accidental global";
}
// Foo 被调用时, this 指向全局变量(window)
foo();
//window意外创建了全局变量var1
// 如果我们使用这些全局变量来暂存大量的数据,一定要在使用之后,对其重新赋值为null

3 .为销毁的定时器和回调函数

1 .如果没有回收计时器,整个第十七依然有效,不但定时器无法被内存回收,定时器中的依赖也无法回收。
2 .

4 .闭包

1 .闭包之间共享作用域,如果这个函数反复执行时,内存会持续增长

5 .dom引用

1 .把对dom的引用保存在一个数组或者Map中
2 .这个时候虽然我们进行了元素移除,但是任然有对元素的引用,那么任然是无法进行内存回收的
3 .对于一个dom树的叶子节点的引用。如果我们引用了一个子节点的元素,但是删除了整个父元素,直观的觉得内存回收应该回收除了被引用的子元素外的其他元素,但是实际上。改子元素是整个父元素的一个子元素,还保留着对父元素的引用。这就会导致整个父元素都不会被回收

WeakSet,WeakMap

1 .在weakset,weakmap中,可以解决内存回收问题,他们对于值的引用可以忽略不计,是弱引用,内存回收机制不会考虑这种引用,当其他引用被消除后,引用就会从内存中被释放。
2 .所以之后操作dom的数据结构都存在这种结构里面算了
3 .主动删除与业务无关的变量

第二波

1 .计算机内存由大量的触发器缓存而成,每个触发器包含几个晶体管。单个触发器都可以通过唯一的标识符寻址,因此我们可以读取和覆盖他们。
2 .程序使用的所有变量和其他数据。程序的代码,包括操作系统的代码都存在内存中
3 .编译代码的时候,编译器可以检查基本数据类型,并提前计算他们需要多少内存。然后将所需大小分配给调用堆栈空间中的程序,分配这些变量的空间就是堆栈空间。当调用空间的时候,他们的内存被添加在现有内存之上,当他们终止时,他们按照后进先出的顺序被移除
4 .编译器是直到每个变量的确切内存地址的。事实上,每当我们写入变量的时候,内部都会被转换成类似 内存地址4127963这样的信息
5 .当函数调用其他函数时,每个函数在调用堆栈时获得自己的块,他保存所有的局部变量,但是也会有一个程序计数器来记住他在执行过程中的位置。当函数完成时,他的内存块将再次用于其他地方
6 .动态编译

1 .当编译时不知道一个变量需要多少内存时,事情就会变得非常复杂了
2 .他的大小不需要在编译的时候知道
3 .在运行的时候执行
4 .分配给堆
5 .

查看代码出现内存泄露

1 .https://www.fundebug.com/?utm_source=xiaozhi
2 .

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,470评论 1 3
  • 1.Set 基本用法 ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本...
    雨飞飞雨阅读 1,841评论 0 7
  • 1. 晚上临睡前在床上把几天前从小店那里买来的大瓶农夫山泉匀到从超市买来已经喝完了的景田中瓶矿泉水瓶里。 两瓶口相...
    小萝莉刘胜阅读 216评论 0 0
  • 这三周,在身体不舒服的状态下,竟然完成了“每日一鼓励”的挑战! 感恩孙律师和杜鹃的支持和陪伴! 感恩为我点赞、给我...
    游游老师阅读 759评论 5 7