ill*_*ant 4 c# garbage-collection objective-c automatic-ref-counting
关于objective c ARC机制,有很多关于SO的问题.许多人都在询问是否ARC要更换GC等等.甚至还有人讨论ARC从GCMac应用程序迁移到是否合理(如果在一些数据类型中不需要太多工作来处理复杂的引用等).
明显的缺点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一样强大和通用是
基于C的世界中的循环检测需要以下两种方法之一:
所有对象的所有分配总是通过写入屏障(并且可能是读取屏障,具体取决于收集器的功能)
扫描周期时,扫描仪必须"停止世界"以保持存储器处于一致状态
前者是统一的内存模型,与直接C相比会产生巨大的开销(但可以比纯手动保留/释放更高效).在实践中,您通常会使用某种手动引用计数(从与ARC编译器中的桥接机制完全相同; CFBridgingRetain()等)将对象从屏障世界"转移"到非屏障位置. ...)
后者在开发人员上要容易得多,但是使得性能完全不可预测,因为你永远不知道任何给定线程何时停止或持续多长时间.没有障碍,你不能一次只停止一个线程.
与基于C的环境的相对"在金属"性质相比,这两者都增加了显着的开销.在基于VM的环境中,成本主要通过结合对象图连接的虚拟化与JIT编译后的执行路径相结合来实现,这种优化实现了超出C(预编译,静态可执行文件)等预编译环境的可能性. ...而不是预编译器本身).
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |