垃圾回收是一种自动的内存管理机制。当一个对象不再被需要的时候,它所占用的内存就应该被释放掉,这个过程就是垃圾回收。
首先,什么是垃圾?
如果一个对象没有被引用,也就是说是不可访问的,他就是垃圾。那被引用的就一定不是垃圾吗?也有特例,比如几个对象之间互相引用,形成了一个环,如果它们的外部没有其他变量引用它们了,那它们就类似于一个孤岛,虽然互相是有引用的,但是也是垃圾,也要被回收。
那浏览器是怎么找到垃圾并且将它们清除掉的呢?-垃圾回收算法
-
标记-清除算法:会遍历所有的根对象(全局对象),把这个根对象的引用打上标记,再遍历这些引用,如果还有引用,那就再打标记,一直遍历到没有引用其他的对象了。这时所有被标记的就是可访问的,那其他剩余的没有标记的,就会被回收掉。
这个算法的优点就是思路简单,实现简单。但是缺点是需要遍历,如果数量很多,那就很浪费时间。有几个优化:1. 分代回收:把所有对象分成新的,旧的两类。旧的就是长时间存活在内存里的,成为垃圾的可能性很低,就可以检查次数少一些。新的就是那些产生后被使用完很快死掉的对象,成为垃圾的可能性高,就可以检查次数多一些。2. 闲时回收:在CPU空闲的时候再执行,避免影响正常代码的执行。
-
引用计数算法:记录每个对象被引用的次数。比如当声明一个变量,创建引用时就把这个值的引用次数加1,当删除了这个值的一个引用,就把他的引用次数减1.当引用次数是0的时候,就意味着没有变量引用这个值了,他就是不可访问的,那么他就可以被回收了。这个方法的好处就是不用遍历,可以直接记录次数。