python的内存管理

python中的内存管理是通过引用计数垃圾回收模块实现。

  • 一般情况下python在堆中new出来的对象都是通过引用计数来管理的,当引用计数为0的时候,就会立即通过tp_dealloc方法释放对象。注意这里是tp_dealloc而不是free。因为很多对象都会有缓存机制,比如new出来的int对象在释放的时候都会放回到free_list中,而不是将int对象所占用的内存free调了,还给系统。

  • 但是引用计数管理没法回收两个相互引用的对象,因为他们的引用计数永远都不会为零,所以垃圾回收模块(GC)就是用来打破对象之间相互引用的循环。被GC模块管理的对象都是container对象,因为只有container对象才能有对其他对象的引用,才会发生对象相互引用的问题。比如list, dict, tuple。
    container对象在堆上被new出来的时候通过通过_PyObject_GC_Malloc这个接口实现的,主要是为了都能把这些对象通过双向链表管理起来,在对象被销毁的时候通过_PyObject_GC_UNTRACK接口将对象从链表中摘除。

在GC模块中还有一个份代收集的问题,好啦,这个在书里讲的更清楚点,还是看书吧。

关于内存管理的python代码风格:
在代码中慎用__del__方法,因为GC模块无法回收有__del__方法的对象,因为python无法保证他们能安全的被回收。所以你要保证这个对象能通过引用计数的方式完成对象的回收动作,但是谁知道呢,总会有不小心的时候。

如果不使用__del__方法,但是有些动作想在对象被销毁的时候搞一把,怎么办。可以通过weakref来实现这个操作。这个后面写吧。

阅读更多
个人分类: For-python
上一篇python 一切皆对象
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭