全局解释锁(GIL)
线程全局锁(Global Interpreter Lock),即Python解析器(CPython)为了保证线程安全而采取的独立线程运行的限制,可以理解为对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。
所以,Python 的线程更适用于处理I/O密集型任务(因为等待IO的时候,CPU去执行其他线程),而不是需要多处理器并行的计算密集型任务。
内存管理
垃圾回收
Python GC主要使用引用计数来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
引用计数
python里每一个东西都是对象,它们的核心就是一个结构体:PyObject,
有当一个对象有新的引用时,它的ob_refcnt
就会增加,当引用它的对象被删除,它的ob_refcnt
就会减少。当引用计数为0时,改对象的生命也结束了。
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
import sys
# 可以使用sys.getrefcount()来查看当前对象的引用数,
# 由于对象作为sys.getrefcount()的参数,所以会比期望的多1。
a = 123
sys.getrefcount(a)
引用计数增加场景:
- 创建对象的别名, n = m = Object()
- 作为容器对象的一个元素, n = [Object]
- 作为参数传递给函数
引用计数减少场景:
- 对象别名被显示的销毁,del a
- 对象的别名被赋值给其他对象
- 从一个集合对象中移除,或者集合对象被销毁
- 一个本地引用离开当前作用域,比如作为函数参数时,函数执行结束
但是引用计数机制带来一个问题,无法处理循环引用的问题,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,导致内存泄漏。
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)
分代回收
分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。Python默认定义了三代对象集合,引用数越大,对象存活时间越长。
检测循环引用
<br />每次当你创建一个对象或其他什么值的时候,Python会将其加入零代链表,Python会循环遍历零代列表上的每个对象,检查列表中每个互相引用的对象,根据规则减掉其引用计数。在这个过程中,Python会一个接一个的统计内部引用的数量以防过早地释放对象。<br />
回收阈值
在垃圾回收时python会”stop the world”,当Python运行时,Python分配内存的次数减去释放内存的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。
import gc
gc.get_threshold() (700, 10, 10) # 0代,1代,2代的垃圾回收
gc.collect() # 手动启动垃圾回收
内存池机制

Layer3(对象缓冲池)
- 整数对象缓冲池:对于[-5,257]这样的小整数,系统已经初始化好,可以直接拿来用。
- String对象缓冲池:256个Ascii码进行了对象缓冲池
-
Layer2(内存池)
大内存使用malloc进行分配(256K为界限分大小内存)
- 小内存使用内存池进行分配
参考文档:
Python程序运行的原理: http://www.cnblogs.com/restran/p/4903056.html
https://www.cnblogs.com/webber1992/p/6597166.html
https://blog.csdn.net/lxlmycsdnfree/article/details/78782165
https://docs.python.org/zh-cn/3.7/library/gc.html#module-gc
Python与Ruby的垃圾回收:https://www.cnblogs.com/pinganzi/p/6646742.html#_label0
Python内存池:https://blog.csdn.net/zhzhl202/article/details/7547445
Python内存管理:https://www.cnblogs.com/geaozhang/p/7111961.html#yinyongjishu
全局解释器:https://www.cnblogs.com/lidagen/p/7237674.html
内存泄漏:https://www.cnblogs.com/xybaby/p/7491656.html
https://www.cnblogs.com/xybaby/p/7491656.html#_label_9