浅析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;
解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
相关推荐:
以上就是浅析JS垃圾收集机制和内存管理的详细内容,更多请关注其它相关文章!
上一篇: javascript中求根的函数有哪些
下一篇: ajax基本通用代码有哪些