垃圾回收的基本原理:
1. 标记-清除(Mark and Sweep):
这是最常见的垃圾回收算法之一。它分为两个阶段:
标记阶段:从根对象出发,标记所有能够被访问到的对象。
清除阶段:清除所有未被标记的对象,释放其占用的内存空间。
2. 引用计数(Reference Counting):
这个方法是跟踪记录每个对象被引用的次数。当引用次数变为0时,说明该对象不再被引用,可以被回收。
但是引用计数无法解决循环引用的问题,即两个或多个对象互相引用,导致它们的引用计数永远不会变为0,从而无法被回收。
JavaScript中的垃圾回收:
标记-清除算法:
JavaScript引擎会定期执行垃圾回收,标记所有的活动对象,然后清除未被标记的对象。
分代回收(Generational Collection):
将对象根据其存活时间分为不同的代。新创建的对象在新生代中,经过多次垃圾回收后若仍存活,则会被移到老生代。
这样可以根据对象的生命周期采用不同的回收策略,提高垃圾回收效率。
增量回收(Incremental Collection):
将垃圾回收过程分解为多个小步骤执行,可以在用户代码执行期间逐步进行垃圾回收,减少回收造成的停顿时间。
空间分配(Allocation):
JavaScript引擎通常使用堆来分配内存空间,当需要创建新的对象时,会在堆中分配内存空间。
优化技术:
引擎会尽可能地优化垃圾回收算法和策略,以提高性能和降低内存占用。
垃圾回收的优势:
方便: 无需手动管理内存,减少了程序员的工作量。
安全: 避免了内存泄漏和野指针等内存错误。
效率: 自动回收不再使用的内存,减少了内存碎片,提高了内存利用