Python GC引用计数和Objective-C的ARC之间有什么区别?

时间:2013-07-20 00:00:02

标签: python objective-c garbage-collection

我正在阅读有关各种语言的内存管理以及Objective-C没有托管内存这一事实,因为它会导致移动应用程序的UX出现断断续续的情况。

我知道ARC不处理循环引用,而Python的GC则不行。

我知道ARC根本不是垃圾收集器,因此它不会停止执行主程序来执行内存管理。

Python可以使用混合方法吗?利用ARC的一些优点,同时更少地运行GC(或者更短的时间),以便它仍然可以处理循环引用?

或者在Python社区中尝试过类似的东西?

编辑:我知道Python使用引用计数,但据我所知,引用降至0的对象不会立即从内存中删除(ARC会这样做)。我想知道是否立即释放该对象占用的内存可以使Python更适合在低内存环境中使用,并且因为在这种情况下GC可能运行得更少,它会导致更少的线程中断。就UX而言,这两件事对于移动应用程序来说都是理想的选择。

1 个答案:

答案 0 :(得分:5)

据我所知,Objective-C的ARC最终与CPython的引用计数相同,减去循环引用处理。 ARC只是一个花哨的新名称,被重新发明,意味着Objective-C编译器而不是程序员自动插入引用计数代码。

让我们假设为了这个答案的目的,可以在Objective-C中重写CPython(这是不现实的)。使用ARC而不是显式引用计数得到的是:

  • 更简单的代码。

  • 没有循环收集。

  • 保证正确的代码。在CPython中有一些已知的,可能是一些未知的引用计数问题,这些问题可能导致在一些极不可能的情况下崩溃; Lib/test/crashers/中的一些基于此。

  • 代码稍慢。实际上,在找到我们实际上不需要操纵引用计数器的情况时,编译器通常不如人类聪明。

作为PyPy开发人员,我可以报告自己的经验:我们在过去的某个时刻尝试过这样做,即在编译期间自动插入引用计数代码。但是我们放弃了这种方法,因为如果没有高级优化,你会得到认真更慢的代码。相反,我们现在使用一些简单的“真实”垃圾收集(GC)系统;它提供了比CPython的引用计数更好的性能。因此,我对编译器制造商的建议是,如果你想要一个可以自动插入必要代码的编译器,你可以更好地使用任何一些更好的GC。最后我检查过,LLVM的支持在这方面几乎无效。