欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

浅析JS垃圾收集机制和内存管理

程序员文章站 2022-03-04 22:09:34
...
这篇文章主要介绍了浅析JS垃圾收集机制和内存管理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

垃圾收集

javascript中的垃圾收集机制很简单:找出那些不在使用的变量,然后释放他们.

局部变量只存在在函数执行过程中,所以,当函数执行结束之后,局部变量就没有存在的必要了.但是并不是所有的变量都是那样容易判断的,所以要用一些方法来回收这些变量

1 标记清除:

javascript中最常用的垃圾收集方式是清除标记.当变量进入环境时,将这个变量标记为"进入环境",当变量离开环境时,将变量标记为"离开环境",一般来说,咱们只会清除带有离开环境标记的变量,因为已经没办法访问他们了.然后垃圾收集器来完成内存清除工作.

2 引用计数:

这个方法不是那么常用.引用计数的意思就是记录每个值被引用的次数,当被引用的次数减为0的时候,则说明再也没有办法访问那个值了,所以可以将它占用的内存释放.

但是引用计数有一个问题:循环引用.举个例子:


function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}

在这个例子中,在这个例子中,objectA 和objectB 通过各自的属性相互引用;也就是说,这两个对象的引用次

数都是2。在采用标记清除策略的实现中,由于函数执行之后,这两个对象都离开了作用域,因此这种相互引用不是个问题。但在采用引用计数策略的实现中,当函数执行完毕后,objectA 和objectB 还将继续存在,因为它们的引用次数永远不会是0。假如这个函数被重复多次调用,就会导致大量内存得不到回收

为了避免这样的问题,咱们要在不使用他们的时候将他们置为null,以消除循环引用

内存管理:

我们都知道 分配给Web浏览器的可用内存数量通常要比分配给桌面应用程序的少。这样做的目的主要是出于安全方面的考虑,目的是防止运行JavaScript 的网页耗尽全部系统内存而导致系统崩溃。内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句数量。

因此,确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行 中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null 来释放其引用——这个 做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在 它们离开执行环境时自动被解除引用,如下面这个例子所示:

function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 手工解除globalPerson 的引用
globalPerson = null;

解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

相关推荐:

java垃圾回收机制、内存管理

JS的垃圾回收机制和内存分配

JavaScript垃圾收集机制及内存泄漏问题

以上就是浅析JS垃圾收集机制和内存管理的详细内容,更多请关注其它相关文章!