我正在阅读有关各种语言的内存管理以及Objective-C没有托管内存这一事实,因为它会导致移动应用程序的UX出现断断续续的情况。
我知道ARC不处理循环引用,而Python的GC则不行。
我知道ARC根本不是垃圾收集器,因此它不会停止执行主程序来执行内存管理。
Python可以使用混合方法吗?利用ARC的一些优点,同时更少地运行GC(或者更短的时间),以便它仍然可以处理循环引用?
或者在Python社区中尝试过类似的东西?
编辑:我知道Python使用引用计数,但据我所知,引用降至0的对象不会立即从内存中删除(ARC会这样做)。我想知道是否立即释放该对象占用的内存可以使Python更适合在低内存环境中使用,并且因为在这种情况下GC可能运行得更少,它会导致更少的线程中断。就UX而言,这两件事对于移动应用程序来说都是理想的选择。
答案 0 :(得分:5)
据我所知,Objective-C的ARC最终与CPython的引用计数相同,减去循环引用处理。 ARC只是一个花哨的新名称,被重新发明,意味着Objective-C编译器而不是程序员自动插入引用计数代码。
让我们假设为了这个答案的目的,可以在Objective-C中重写CPython(这是不现实的)。使用ARC而不是显式引用计数得到的是:
更简单的代码。
没有循环收集。
保证正确的代码。在CPython中有一些已知的,可能是一些未知的引用计数问题,这些问题可能导致在一些极不可能的情况下崩溃; Lib/test/crashers/
中的一些基于此。
代码稍慢。实际上,在找到我们实际上不需要操纵引用计数器的情况时,编译器通常不如人类聪明。
作为PyPy开发人员,我可以报告自己的经验:我们在过去的某个时刻尝试过这样做,即在编译期间自动插入引用计数代码。但是我们放弃了这种方法,因为如果没有高级优化,你会得到认真更慢的代码。相反,我们现在使用一些简单的“真实”垃圾收集(GC)系统;它提供了比CPython的引用计数更好的性能。因此,我对编译器制造商的建议是,如果你想要一个可以自动插入必要代码的编译器,你可以更好地使用任何一些更好的GC。最后我检查过,LLVM的支持在这方面几乎无效。