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