javascript 内存泄露

2019-12-09  本文已影响0人  _一九九一_

js内存溢出


JS程序的内存溢出后,表现为程序突然卡死假死报错

内存生命周期


如时执行回收


几种常见的js内存泄露


  1. 全局变量泄漏,调用的时候 this 指向了全局对象(window)
  2. 没有及时清理的计时器或回调函数
  3. 闭包, 事件处理回调,导致DOM对象和脚本中对象双向引用,这个时常见的泄漏原因
  4. script 中存在对DOM/BOM 对象的互相引用导致

例子


function fn1() {
    var obj = {name: 'aaa', age: 10};
}
function fn2() {
    var obj = {name:'bbb', age: 10};
    return obj;
}

var a = fn1();
var b = fn2();

垃圾收集器是怎么判断哪个变量要回收( 标记清除和引用计数 )


标记清除和引用计数

标记清除

function test(){
  var a = 1 ;             // 被标记 ,进入环境 
  var b = 2 ;             // 被标记 ,进入环境
}
test();                     //执行完毕 之后 a、b又被标离开环境,被回收

到目前为止,IE9+、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

引用计数

function test(){
    var a = {} ;         //a的引用次数为0 
    var b = a ;         //a的引用次数加1,为1 
    var c =a;           //a的引用次数再加1,为2
    var b ={};          //a的引用次数减1,为1
}

function fn() {
    var a = {};
    var b = {};
    a.pro = b;
    b.pro = a;
}
fn();

GC根


GC的缺陷


GC优化策略


Chrome V8 垃圾回收算法采用分代回收策略

V8的内存限制

64位系统下,新生代内存大小为32MB,老生代内存大小为1.4GB。
32位系统新生代内存大小为16MB,老生代内存大小为700MB。

新生代内存:

老生代内存

上一篇 下一篇

猜你喜欢

热点阅读