栈内存区[stack]:用于直接分配数据,存取速度较快,数据存储不稳定,适
用于小数据块的快速存取,一般在程序中用于存储变量数据
堆内存[heap]:存储数据稳定持久,一般用于存储加载较为重量级的数据,
如程序运行过程中的对象都是存在堆内存中的
静态区[static]:主要用于加载存储程序中的一些静态数据、常量数据等等,
在 PYTHON 中的不可变数据类型的数据,也会存储在静态常量区内存中
方法区[data]:主要用于加载程序中使用的代码数据、二进制数据、方法数据等等程序运行需要的预加载数据
内存分配图
对象的引用赋值
对象的引用赋值,可以将对象的内存地址同时赋值给多个变量,这多个变量中存放的都是同
一个 对象的引用地址,如果通过一个变量修改了对象内容,那么其他变量指向的对象内容也
会同步发 生改变对象的浅拷贝
对于程序中对象的拷贝操作,除了前面介绍的引用赋值操作可以完成同一个对象在程序不同位置 的操作,这里的浅拷贝更是一种对象的临时备份,浅拷贝的核心机制主要是赋值对象内部数据的 引用
对象的深拷贝
和对象的浅拷贝不同,对象的深拷贝,是对象数据的直接拷贝,而不是简单的引用拷贝
主要 是通 过 PYTHON 内建标准模块 copy 提供的 deepcopy 函数可以完成对象深拷贝
垃圾回收机制
垃圾回收机制(Garbage Collection:GC)基本是所有高级语言的标准配置之一了
在一定程度上,能优化编程语言的数据处理效率和提高编程软件开发软件的安全性能引用计数
引用计数[Reference Counting:RC]是 PYTHON 中的垃圾回收机制的核心操作算法
该算法最早是 George E.Collins 在 1960 年首次提出的,并在大部分高级语言中沿用
至今,是很多高级语言的垃圾回收核心算法之一
引用计数算法的核心思想是:当一个对象被创建或者拷贝时,引用计数就会+1,当这个对象
的多个引用变量,被销毁一个时该对象的引用计数就会-1,如果一个对象的引用计数为 0 则
表示该对象已经不被引用,就可以让垃圾回收机制进行清除并释放该对象占有的内存空间
了。
优点是:操作简单,实时性能优秀,能在最短的时间获得并运算对象引用数
缺点是:为了维护每个对象的引用计数操作算法,PYTHON 必须提供和对象
对等的内存消耗来维护引用计数,这样就在无形中增加了内存负担;同时引用计数对于循环
应用/对象之间的互相引用,是无法进行引用计数操作的,所以就会造成常驻内存的情况
PYTHON 是一个面向对象的弱类型语言,所有的对象都是直接或者间接继承自 object 类
型,object 类型的核心其实就是一个结构体对象标记清除
PYTHON 中的标记-清除机制主要是针对可能产生循环引用的对象进行的检测机制
标记清除算法核心思想:首先找到 PYTHON 中的一批根节点对象,如 object 对象,通过
根节点对象可以找到他们指向的子节点对象,如果搜索过程中有这个指向是从上往下的指
向,表示这个对象是可达的,否则该对象是不可达的,可达部分的对象在程序中需要保留下
来,不可达部分的对象在程序中是不需要保留的class A:
pass
class B:
pass
a = A()
b = B()
a.bb = b
b.aa = a
如果代码中执行了
del a
del b
我们会发现,对象 A()和对象 B()依然有引用指向他们,如果是之前的引用计
数的方式明显区分不了这样的对象是否应该删除;但是标记-清除的方式,就
可以标记出来对象 A()和对象 B()是不可达对象,不需要保留,直接删除即
可!
分代回收PYTHON 中的分代回收机制,是一种通过的做法,PYTHON 内部处理机制
定义了三个不同的链表数据结构[第零代(年轻代),第 1 代(中年代),第 2 代(老年代)]
PYTHON 为了提高程序执行效率,将垃圾回收机制进行了阈值限定,0 代链表中的垃圾回收
机制执行最为密集,其次是 1 代,最后是 2 代;
备注:弱代假说:程序中年轻的对象往往死的更快,年老的对象往往存活更久
垃圾回收处理
PYTHON 中的 gc 模块提供了垃圾回收处理的各项功能机制,必须 import gc 才能使用
gc.set_debug(flags):设置 gc 的 debug 日志,一般为 gc.DEBUG_LEAK
gc.collect([generation]):显式进行垃圾回收处理,可以输入参数~参数表示回收的
对象代数,0 表示只检查第 0 代对象,1 表示检查第 0、1 代对象,2 表示检查 0、1、2 代
独对象,如果不传递参数,执行 FULL COLLECT,也就是默认传递 2
gc.set_threshold(threshold0 [, threshold2 [, threshold3]]):设置执行
垃圾回收机制的频率
gc.get_count():获取程序对象引用的计数器
gc.get_threshold():获取程序自动执行 GC 的引用计数阈值
以上是 PYTHON 中垃圾回收机制的基本操作,在程序开发过程中需要注意:
项目代码中尽量避免循环引用
引入 gc 模块,启用 gc 模块自动清理循环引用对象的机制
将需要长期使用的对象集中管理,减少 GC 资源消耗
gc 模块处理不了重写__del__方法导致的循环引用,如果一定要添加该方法,需要显式调用 gc 模块的 garbage 中对象的__del__方法进行处理