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

零到壹度
零到壹度 原创
2018-04-04 14:36:24 860浏览

这篇文章主要介绍了浅析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垃圾收集机制和内存管理的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。