关于javascript:垃圾回收内存管理

垃圾回收

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对象循环援用

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理