内存管理
python的内存管理相对于C,C++等语言来说要简单一些,相当于托管的状态,首先关于对象的创建和引用,python提供了对象池这样的一个容器,就是将一堆对象放置到一起,需要用的时候,就从对象池中取出,用完再放回对象池中,这样的优点是速度快,不需要每一次都新创建。
在对象池中放置的对象有,单个字符,如a,A,b,B…等,小整数,[-5, 257),单个英文单词,apple,banana等,但是对于大整数,多个单词组合出现的情况,对象池中不包含这些内容,需要新创建。
垃圾回收机制
垃圾回收是内存管理中非常重要的一环,garbage collection,对于新对象的话需要分配内存,但是如果分配了内存不回收,就会造成内存不够用,从而导致内存泄露,所以需要做识别垃圾对象,回收内存这一个工作。
在python中,垃圾回收方法主要使用的是引用计数方法,然后使用标记清除算法和分代收集算法辅助,来完成整个的垃圾回收机制。
引用计数机制
引用计数机制方法,主要就是判断这个变量的引用是否为0,如果为0,则回收这个变量,如果大于0,则不回收,采用这种方法的优点是简单实时,但是缺点是消耗的资源也比较多,需要耗费资源来进行计数,而且无法收集具有循环引用的变量,比如a变量引用了b变量,b变量也引用了a变量,那这样引用计数就永远不会降为0,也就不会被回收。
在引用计数机制中,出现引用+1的情况有以下几种
- 创建对象的时候
- 引用对象的时候
- 将变量传入函数中使用的时候
- 当变量是某个元素的成员的时候
出现引用计数-1的情况
- 销毁别名的时候
- 别名重新赋值的时候
- 离开作用域,也就是相当于局部变量离开函数的时候
- 容器被销毁的时候
用户可以通过getrefcount()方法来查看变量的引用数
gc模块
而分代收集算法则可用来弥补引用计数机制的不足,解决循环引用的问题,在使用之前需要先导入垃圾回收gc模块,触发垃圾回收可以使用gc.collect()方法。
使用gc.get_count()方法查看当前内存变量引用情况,返回一个长度为三的元组,第一个元素的意义是当前对象的数量,第二个元素的意义是清理零代列表的次数,第三个元素的意思是清理一代列表的次数。
使用gc.get_threshold()可以获取当前设置清理的阈值,返回相同的元素,第一个表示已创建的对象的个数-已回收的对象的个数>700,则进行0代链表的清零,第二个说明每清理10次0代链表,清理一次1代链表,顺便清理一次0代链表,第三个说明每清理10次1代链表,清理一次2代链表,顺便清理一次0,1代链表。还可以采用set方法来设置自己想要的阈值。
使用gc.garbage查看垃圾列表,目前为空
也可以使用gc.disable()关掉垃圾回收机制,但是这样做会带来风险,除非业务需求,否则不要轻易尝试,使用gc.enable()打开垃圾回收机制,具体gc的用法可以使用help命令查看完整内容