js垃圾回收机制详解

一、前言

大家好,我是思航。最近我们游戏在进行内存优化,所以大家网上找了很多教程,来定位和查找内存泄漏问题。今天呢,我打算换个角度来聊聊这个问题。

二、什么是内存泄漏

当计算机动态内存不再需要时,应该释放。如果没有释放,就会产生内存泄漏。
即:当我们认为不需要了,但是js却没有回收时,就产生了内存泄漏

我们认为不需要了 ==> 对象清空、关闭界面等操作

js 认为内存不需要了 ==> 需要了解 js的 垃圾回收机制

1. 引用计数

我们通过下面一个例子来讲一下引用计数的机制。

function func () {
	var objA = {a: 1};
	var objB = objA;
	objA = null;
	objB = null;
}

在这里插入图片描述
通过上面图解,我们可以看到,当函数 func执行后,对象{a:1}所占用的内存因为没人引用了,就会被释放掉。

在早期使用引用计数的时候,很容易因为循环引用问题,导致内存泄漏。下面我们还是通过一个例子来看下。

function func () {
	var objA = {};
	var objB = {};
	objA.a = objB; // 这边两个对象互相引用
	objB.a = objA;  
	objA = null;
	objB = null;
}

在这里插入图片描述
通过上面图解可以看到,当函数执行完后,两个对象还互相引用着,所以不会被释放,导致了内存泄漏。

当然我们可以通过手动解开引用,来处理这个问题。

function func () {
	var objA = {};
	var objB = {};
	objA.a = objB;
	objB.a = objA;
	objA.a = null; // 这边解开引用
	objB.a = null;
	objA = null;
	objB = null;
}

2. 标记清除

现在浏览器基本都使用了标记清除垃圾回收方式。
js中的全局对象,在浏览器中是window对象。定期的从这个全局对象开始,递归查找引用的对象,如果能访问到,就表示活着,不会被释放。

还是之前的例子:

function func () {
	var objA = {};
	var objB = {};
	objA.a = objB; // 这边两个对象互相引用
	objB.a = objA;  
	objA = null;
	objB = null;
}

在这里插入图片描述
虽然最后两个对象互相引用着,但是这两个对象并不能通过window对象访问到,所以会被回收掉。

三、总结

通过上面我们了解了js的垃圾回收机制(现在主流使用的是 标记清除
只有知道了原理,我们才能够更好地避免写出有问题的代码。而不是通过查了一些教程,就开始使用控制面板里面的 Performance( 更多是用来查性能问题) 和 Memory (查找内存问题) ,而我更希望是大家在知道了什么是内存泄漏后,再去学习怎么定位内存泄漏。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值