ARC +循环引用收集器与前沿GC(比如.NET 4.5 GC)

ill*_*ant 4 c# garbage-collection objective-c automatic-ref-counting

关于objective c ARC机制,有很多关于SO的问题.许多人都在询问是否ARC要更换GC等等.甚至还有人讨论ARCGCMac应用程序迁移到是否合理(如果在一些数据类型中不需要太多工作来处理复杂的引用等).

明显的缺点ARC是完全没有任何清理循环引用的机制(编辑:循环引用).这是关于内存泄漏的一个非常好的和简单的解释ARC ,Objective-C中的自动引用计数是什么样的泄漏不能阻止或最小化?

和苹果的优势有趣概述ARC了他们GC. http://lists.apple.com/archives/objc-language/2011/Jun/msg00013.html

我对如何GC工作以及它有什么样的问题有了很好的理解,但是从C#/.NET世界到objective c / Cocoa阅读的东西ARC我仍然不能得到一个简单的东西 - 为什么没有后台机制来清理ARC应用程序中的循环引用.

它不需要线程挂起,是吗?所以相对便宜.实施一个是一个问题吗?GC轻型版本扫描堆栈,寄存器,构建图形,查找循环引用并释放内存而不挂起应用程序线程,听起来很酷,不是吗?

它需要严格的计算还是其他资源?我很难想象如何在不构建所有对象图的情况下找到循环引用,但假设这个过程是背景和连续的,那么即使这样也应该没问题

.NET 4.5 GC(http://blogs.msdn.com/b/dotnet/archive/2012/07/20/the-net-framework-4-5-includes-new-garbage-collector-enhancements-for-client -and-server-apps.aspx)在性能方面有了很大的改进,但在ARC系统中拥有循环引用收集器将成为第二个赢家?ARC系统发展的下一步是什么?如果有可能并且有时会发生ARC循环引用收集器,那么它可以完全替换GC,或者下一代GC(具有更好的性能)是否会消除ARC系统?

UPD:请不要发布关于weak引用的信息,我知道如何处理ARC中的循环引用,这很明显,问题是关于将循环引用收集器添加到现有ARC机制的可能性,因为它将像现代GC一样强大和通用是

bbu*_*bum 8

基于C的世界中的循环检测需要以下两种方法之一:

  • 所有对象的所有分配总是通过写入屏障(并且可能是读取屏障,具体取决于收集器的功能)

  • 扫描周期时,扫描仪必须"停止世界"以保持存储器处于一致状态

前者是统一的内存模型,与直接C相比会产生巨大的开销(但可以比纯手动保留/释放更高效).在实践中,您通常会使用某种手动引用计数(从与ARC编译器中的桥接机制完全相同; CFBridgingRetain()等)将对象从屏障世界"转移"到非屏障位置. ...)

后者在开发人员上要容易得多,但是使得性能完全不可预测,因为你永远不知道任何给定线程何时停止或持续多长时间.没有障碍,你不能一次只停止一个线程.

与基于C的环境的相对"在金属"性质相比,这两者都增加了显着的开销.在基于VM的环境中,成本主要通过结合对象图连接的虚拟化与JIT编译后的执行路径相结合来实现,这种优化实现了超出C(预编译,静态可执行文件)等预编译环境的可能性. ...而不是预编译器本身).