【问题标题】:Why doesn't iOS have automatic garbage collection?为什么iOS没有自动垃圾收集?
【发布时间】:2011-06-17 11:47:38
【问题描述】:

在 iOS 上使用 Objective-C 进行开发时,内存管理目前必须由开发人员执行。其他一些移动平台使用自动垃圾收集来消除管理内存的需要。

iOS 设备上不使用垃圾收集的原因可能是什么?

【问题讨论】:

  • 误导性标题(但标签正确)。 Objective-C 有 GC,但在 iOS 上没有。
  • a) 主观和争论 b) 稍等。
  • 我建议我们对保留的内容和不保留的内容有更多的控制权。但是,它确实在对象上有autorelease,这是一种垃圾收集。
  • 我认为这个问题是有效的。我相信其他人已经考虑过这一点,并且接受的答案可能会为 Obj-C 和 Cocoa-Touch 的工作原理提供一些更深入的了解。想想看;)
  • @Sherm Pendley,在一个简单的项目中工作量并不大。随着项目的复杂性和循环引用的增长——在所有现代语言中,我们认为这是理所当然的“免费”——确保你的对象实际上保留在正确的点的噩梦会增加很多项目开销。此外,由于对象引用在令人惊讶的时间被释放,调试起来有点困难。

标签: iphone objective-c garbage-collection


【解决方案1】:

垃圾回收的问题在于,内存使用量会一直增长,直到它被回收,因此分配的内存可能比需要的多。这对于内存受限且没有交换选项的设备是不利的。

当垃圾收集器运行时,它会扫描堆以查找不再使用的内存,这是一个昂贵的过程,会减慢您的设备直到完成。

【讨论】:

  • 而且重复做它的事情。
  • +1 用于垃圾收集进程的内存使用!没有立即想到的东西。你只是假设垃圾收集可以节省内存!
  • "...所以分配的内存可能比需要的多。"不会,
  • 这是对垃圾收集 (GC) 的过度简化。它们要复杂得多,例如查看分代 GC(相当标准),它可以快速收集短期对象,而更长期的对象很少被检查收集。这只是基本的想法,在实践中还有更多的优化和微调。另请参阅解决“冻结”问题的“增量”收集。哎呀,他们甚至可以并发。到目前为止,我还不清楚苹果为什么选择 ARC,他们给出的原因似乎过于简单化了。重新计数有其自身的大量开销。
【解决方案2】:

在 WWDC 2011 上,Apple 解释说他们不希望在其移动设备上进行垃圾收集,因为他们希望应用能够在充分利用所提供资源的情况下运行,并且具有很强的确定性。垃圾收集的问题不仅在于对象会随着时间的推移而累积,直到垃圾收集器启动,而且您无法控制何时垃圾收集器将启动。这会导致非确定性行为,可能会导致您不想要它们时可能发生的减速。

底线:你不能说,“好的。我知道这些对象会在 X 时间点被释放,并且不会与正在发生的其他事件发生冲突。”

【讨论】:

  • 现在有了automatic reference counting,您将获得两全其美:开发人员不再需要担心对象的保留/释放,您没有垃圾收集器进程随机减慢执行速度,而且您仍然对内存使用保持相当严格的控制。
  • @Brad:没错!如果你真的想使用 MRC(手动引用计数),你可以。您甚至可以合并使用两种引用计数系统的文件。
  • 你的底线不是真的。根据你的垃圾收集器,你可以有办法强制收集,也可以推迟收集。后者通常是通过预先创建对象池然后重用它们并在您正在执行的任何关键操作期间避免任何分配来完成的,因为 GC 通常是通过分配触发的。请注意,即使在手动内存管理中也会使用这种不分配策略,因为 alloc()/free() 也不是很便宜。同样的原因 UITableView 重用单元格等,“不分配”适用于所有性能关键的情况。
  • 顺便说一下,无论我读到什么内存管理论文,他们一直提到引用计数的总资源使用率高于一个好的垃圾收集器,尤其是 CPU 时间,尽管它穿插在程序执行中(指针更新时的原子引用计数更改)。因此,ARC 是否“最好地利用所提供的资源”是值得怀疑的。确定性更容易理解,但是例如CoreAnimation 无论如何都在自己的线程中运行,它不应该由于 GC 或任何东西而抖动。我很想在一些复杂的应用程序上运行一个 GC,然后看看会发生什么......
【解决方案3】:

主要原因可能是内存负载和性能。引用计数具有较小的内存配置文件,因为它允许应用程序使用的数量比引用计数增长得更多。此外,还有一个性能问题,即当垃圾收集器运行时,必须停止其他线程。在具有快速多核处理器的 Macintoshe 上,这并不是一个真正的大问题,但可能会导致 UI 在移动设备上出现卡顿。

无论如何,这场辩论可能很快就会变得毫无意义。 Clang / LLVM 刚刚添加了一个名为 automatic reference counting 的新功能。这利用了分析能力来自动放入保留、释放和自动释放,这样程序员就不用太多了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2014-12-07
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多