什么是垃圾回收机制?它是如何管理内存的?

垃圾回收机制(Garbage Collection, GC)是一种自动内存管理技术,旨在自动检测和释放不再被程序使用的内存资源,从而防止内存泄漏,减轻程序员手动管理内存的负担,并提高软件的稳定性和可靠性。

1 JS 的垃圾回收机制

  • 对于在 JavaScript 中的字符串/对象/数组是没有固定大小的,只有使用的时候,解释器就会分配内存来存储这些数据,当 JavaScript 的解释器消耗完系统中所有的可用内存时,就会造成系统崩溃

  • 在某些情况下,不在使用到的变量所占用内存没有及时释放,导致程序中,内存越占越大,极端情况下可能导致系统崩溃

  • 针对 JS 的垃圾回收机制有一下两种方法:,引用计数(之前),标记清除(现代)

2 引用计数

把对象定义为有没有其他对象引用它,如果没有引用指向该对象,对象将被垃圾回收机制回收

引用计数的缺点:

  • 需要一个计数器,所占内存空间大,因为我们也不知道被引用数量的上限
  • 解决不了循环引用导致的无法回收的问题

3 标记清除

标记阶段即为所有活动对象写上标记,清除阶段则把没有标记(也就是非活动对象)销毁

标记清除的缺点:

  • 内存碎片化:空闲内存是不连续的,容易出现很多空闲内存块,还可能会出现分配所需内存过大的对象时找不到合适的块
  • 分配速度慢,因为即便是使用 First-fit 策略,其操作仍是一个 O(n) 的操作,最坏情况是每次都要遍历到最后,同时因为碎片化,大对象的分配效率会更慢

要解决以上的缺点可以使用 标记整理(Mark-Compact)算法 标记结束后,标记整理算法会将活着的对象向内存的一端移动,最后清理掉边界的内存:

4 V8 优化

V 8 的垃圾回收机制也是基于标记清除,不过对其做了一些优化:

  • 针对新生区采用并行回收
  • 针对老生区采用增量标记与惰性回收