垃圾收集与自动引用计数

在上一篇博客文章中,我们了解了iOS如何使用自动引用计数(ARC)作为其对象生存期管理系统。 在这篇文章中,我尝试指出ARC与垃圾回收或更具体地跟踪垃圾回收相比的一些显着差异(更精确的引用计数和跟踪是垃圾回收的两种不同实现。换句话说,ARC是由于跟踪垃圾收集是最常见的垃圾收集类型,因此通常术语“垃圾收集”是指跟踪垃圾收集。

ARC是使用对象所有权的编译器功能 如果对象的引用计数为零(即不再拥有所有者),则ARC会从内存中释放对象,而不是在运行时在后台查找未使用的对象。 ARC在编译时会自动注入与Objective-C运行时等效的对象,以进行保留,释放(编译器在所有应有的位置插入保留和释放)。 我有整篇文章解释ARC的工作原理。

自动参考计数的优点

  • 对象的销毁是实时且可预测的。 它具有对对象的确定性回收(当对对象的最后一个强引用消失时),而GC在“某个时候以后”释放对象。 如果没有长时间的收集周期就不能再引用它们,则将释放对象。 这样可以更快地释放对象。 这对于内存有限的系统(例如移动设备)很重要。
    这定义了GC应用程序中可能存在的一类细微的错误,这些错误由于收集器不会在“错误的窗口中”触发而不会公开。
  • 没有后台处理,这使得它在低功耗系统中再次变得更加高效。
  • 如果活动对象集填满了大部分可用内存,那么跟踪垃圾回收周期就会触发得太多,这需要额外的空间来提高效率。 随着可用空间总量的减少,引用计数性能不会降低。
  • 引用计数的渐近复杂度不取决于堆的总大小。

自动参考计数的缺点

  • 无法收集保留周期。 保留周期即使无法访问,仍将参考计数保持在零以上
  • 需要考虑多线程引用计数。

垃圾回收(GC)是一种自动内存管理尝试,用于回收垃圾或由程序不再使用的对象占用的内存。 在存在任何垃圾回收之前,您必须手动添加要保留和释放的调用(其他语言为“免费”或“销毁”)。

有几种实现垃圾回收的策略,最常见的两种是跟踪和引用计数。 .NET和Java平台使用跟踪垃圾收集。

垃圾收集在运行时起作用。 它检测未使用的对象,并在代码的任何部分不再使用它们时将其释放。 这发生的时间间隔不确定 (在经过一定时间后,或者在运行时看到可用内存变少时),因此不必在不再使用对象的确切时间释放对象。

垃圾收集的优势

  • GC可以清理整个对象图,包括保留周期。 这是垃圾回收相对于ARC的主要优势,您无需担心保留周期。
  • GC在后台发生,因此作为常规应用程序流程的一部分,内存管理工作量减少了。

垃圾回收的缺点

  • 由于GC发生在后台,因此无法确定对象释放的确切时间范围。
  • 当发生GC时,应用程序中的其他线程可能会暂时搁置。

ARC与GC
苹果的Objective-C邮件列表上的一个线程
垃圾收集简史

这个故事发表在中等规模最大的企业家精神出版物The Startup中,紧随其后的是295,232人。

订阅以在此处接收我们的热门新闻。