JavaScript的垃圾回收机制
原文
https://www.jianshu.com/p/4aa1a29781cc
大纲
1、认识垃圾回收机制
2、垃圾回收机制的原理
3、垃圾回收机制的标记策略
4、垃圾回收机制与内存管理
1、认识垃圾回收机制
JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码在执行环境过程中使用的内存。
垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性的执行这一操作。
垃圾回收机制的作用就是将某个不再被使用的变量所占用的内存释放掉。
垃圾回收机制的存在是为了不让内存总是被消耗而被没有释放,导致整个系统无法支持更为庞大的运算。
垃圾回收机制不是总是那么高效,其不是总在运行,因此有时需要我们人为的释放被占用的内存,从而使程序能够支持更为庞大的运算,能够接受更为巨量的数据运算。
2、垃圾回收机制的原理
垃圾收集机制的原理:找出那些不再继续使用的变量,然后释放其占用的内存。
3、垃圾回收机制的标记策略
垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存。用于标识无用变量的策略可能会因实现而异,但具体到浏览器中的实现,则通常有两个策略:标记清除、引用计数。
3.1、标记清除
当变量进入环境时,将其标记为“进入环境”,当变量离开环境时,将其标记为“离开环境”(常用)。
3.2、引用计数
跟踪记录每个值被引用的次数。当声明一个变量a并将一个引用类型的值赋给该变量时,这个值引用次数就是1,如果同一个值又被赋给另一个变量b,则该值的引用次数加1,相反,如果包含这个值引用的变量a又取得了另一个值(也就是前面的引用被覆盖,不再引用前面那个值),则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值,因而就可以将其占用的内存空间回收回来。(少见,几乎不用,除了早版IE的元素JS,因为会出现循环引用的问题)。
var a = obj1; var b = boj1; //这是obj1的引用次数应该为2 var a = obj2; //这是obj1的引用次数为1,obj2的引用次数也为1
4、垃圾回收机制与内存管理
垃圾回收器是周期运行的,而且如果为变量分配的内存数量很可观,那么回收工作量也是相当大的。触发方式的改善很重要。
4.1、管理内存
虽然说使用具备垃圾回收机制的语言写程序,开发人员一般不必操心内存管理的问题。但是JavaScript在进行内存管理及垃圾收集时面临的问题还是有点与众不同的,其中最主要的问题之一,就是出于对安全方面考虑,防止运行JavaScript的网页耗尽全部系统内存而导致系统崩溃,所以分配给Web浏览器的内存数量通常比分配给桌面应用的程序少。
4.2、优化
占用最少的内存可以让页面获得更好的性能。而优化内存占用最佳方式,就是执行中的代码只保留必要的数据(占用必要的内存)。一旦数据不再有用,最好通过将其值设置为null来释放其引用——这个做法叫做解除引用。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动解除引用。
解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾回收器下次运行时将其回收。
function createPerson(name){ var localPerson = new Objcet(); localPerson.name = name; return localPerson; } var globalPerson = createPerson("Nicholas"); //手工解除globalPerson的引用 globalPerson = null;