JavaScript之垃圾收集

垃圾收集

JavaScript 具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预计的收集时间),周期性地执行这样操作。
分析一下局部变量的正常声明周期。局部变量只在函数执行的过程中存在。而在这个过程中,会为局部变量在栈(或堆)内存上分配相应的空间,以便存储它们的值。然后在函数中使用这些变量,直至函数结束。此时,局部变量就没有存在的必要了,因此可以释放它们的内存以供将来使用。
用于标识无用变量的策略,通常有两个测量。

1. 标记清除

JavScript中最常用的垃圾收集方式是标记清除。当变量进入环境时(例如在函数中声明一个变量),就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流就如相应的环境,就会用到它们。而当变量离开环境时,则将其标记为“离开环境”。
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,他会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后,再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存。

2. 引用计算

另一种不太常见的垃圾收集策略叫引用计算。引用计算的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则改值的引用次数加1。相反,如果包含对这个值引用的变量有取得了另外一个值,则这个值的引用次数减1。当这个值引用的次数变成0是,则说明没有办法在访问这个值了,因而就可以将其占用的内存空间回收回来。
循环引用是指对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的指针。这样它们的引用次数永远不会是0,

3. 性能问题

垃圾收集器是周期性运行的,而且如果为变量分配内存数量很客观,那么回收工作量也是相当大的。去顶垃圾收集的时间间隔是一个非常重要的问题。

4. 管理内存

JavaScript在进行内存管理及垃圾收集是面临的最主要问题,就是分配给Web浏览器的可用内存数量通常要比分配给桌面应用程序的少。这样做的目的主要是出于安全方面的考虑,目的是防止运行JavaScrit的网易耗尽全部内存而导致系统崩溃。内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及再一个线程中能够同伙私执行的语句数。
因此,确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其设置为null来释放其引用——这个叫解除引用。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境是自动被解除引用。

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

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

你可能感兴趣的:(JavaScript之垃圾收集)