垃圾回收,内存管理

垃圾回收

JavaScript是使用垃圾回收的语言,浏览器的 Javascript 具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。其原理是:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。这个过程不是实时的,因为其开销比较大并且GC时停止响应其他操作,所以垃圾回收器会按照固定的时间间隔周期性的执行,这不是一个完美的方案,因为某代码块是否还有用属于“不可判定”问题。


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

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

有两种标记清理,标记清理,引用计数(不常用)

标记清理
它是JavaScript常用垃圾回收策略,当变量进入上下文,变量会被加上存在于此上下文的标记(标记方法有很多)。当离开上下文时,加上离开上下文标记。随后垃圾回收程序做一次内存清理,销毁标记,回收内存。
引用计数
引用计数不常用,它的思路是对每个值记录它被引用的次数。一个值,如果被声明变量并给它赋一个引用值,这个引用数是1,如果这个值被赋给另一个变量,引用数加一。如果改值引用的变量被覆盖,引用数减一。引用数为0就可以回收。

function reference(){
 let a = {}//a指向对象的引用数加一,为1
 let b = a//引用数加一,为2
 let c = a//引用数加一,为3
 let b = 6{}引用数减一,为4
 }

引用计数有一个问题:循环引用·

function probromle(){
let obj1 = new Object();
let obj2 = new Object();

let obj1.x = obj2
let obj2.y = obj1

在这里,obj1和obj2互相引用,引用计数都是2,如此,即便函数退出,引用计数依然不会是0导致无法回收。

还有一些问题,比如:com对象循环引用

你可能感兴趣的:(垃圾回收,内存管理)