内存管理

内存生命周期

垃圾回收

垃圾回收在计算机科学中是一种自动的内存管理机制。当一个计算机上的动态内存不再需要时,就应该予以释放以让出内存,这种内存资源管理称为垃圾回收。垃圾回收器可以让程序员减轻许多负担,也减少程序员犯错的机会。

特征

垃圾回收基于两个原理:

  • 考虑某个对象在未来的程序运行中将不会被访问;
  • 向这些对象要求归还内存。

然而,最主要的也是最艰难的部分就是找到「所分配的内存确实已经不再需要了」。

实现

在 JavaScript 中,主要有引用计数和标记-清除这两种方式来找到不再使用的内存。

引用计数

在内存管理环境中,对象 A 如果有访问对象 B 的权限,叫做对象 A 引用对象 B。引用计数的策略是将「对象是否不再需要」简化成「对象有没有其他对象引用到它」,如果没有对象引用这个对象,那么这个对象将会被回收。

但是引用计数有个最大的问题:循环引用。

标记-清除

这个算法把「对象是否不再需要」简化定义为「对象是否可以获得」。

这个算法假定设置一个叫做根(root)的对象(在 JavaScript 里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

从 2012 年起,所有现代浏览器都使用了标记-清除垃圾回收算法。所有对 JavaScript 垃圾回收算法的改进都是基于标记-清除算法的改进,并没有改进标记-清除算法本身和它对「对象是否不再需要」的简化定义。