python内存管理机制

内存池机制

python内存管理机制是什么?

1). 由于python中万物皆对象,内存管理机制就是对象的存储问题,Python会分
		配一块内存空间去存储对象。
		2) 对于整数和短小的字符等,python会执行缓存机制,即将这些对象进行缓存,
		不会为相同的对象分配多个内存空间
		3). 容器对象,如列表、元组、字典等,存储的其他对象,仅仅是其他对象的引
		用,即地址,并不是这些对象本身

小整数池机制

1)Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。
			2)Python对小整数的定义是[-5,257)这些整数对象是提前建立好的,不会被垃圾回收。
			在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象.

PYTHON open存储 with python存储机制_老年代

字符串驻留机制

PYTHON open存储 with python存储机制_引用计数_02

垃圾回收机制

内存溢出和内存泄露

内存溢出:指程序在申请内存时,没有足够的内存空间供其使用
内存泄露:指程序在申请内存后,无法释放已申请的内存空间

内存泄露堆积,内存会逐渐减少,从而降低性能,最终内存泄露会导致内存溢出;

Garbage collection

PYTHON open存储 with python存储机制_老年代_03

引用计数

PYTHON open存储 with python存储机制_老年代_04

引用计数的工作原理

PYTHON open存储 with python存储机制_PYTHON open存储 with_05

导致引用计数+1的情况

1). 对象被创建,例如a=23
			2). 对象被引用,例如b=a
			3). 对象被作为参数,传入到一个函数中,例如func(a)
			4). 对象作为一个元素,存储在容器中,例如list1=[a,a]

导致引用计数-1的情况

1). 对象的别名被显式销毁,例如del a
			2). 对象的别名被赋予新的对象,例如a=24
			3). 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的
			局部变量(全局变量不会)
			4). 对象所在的容器被销毁,或从容器中删除对象

优点

1). 简单
			2). 实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定
			时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

缺点

1), 维护引用计数消耗资源
			2). 循环引用
循环引用

PYTHON open存储 with python存储机制_引用计数_06

标记-清除

标记 - 清除算法

它是由由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。

PYTHON open存储 with python存储机制_PYTHON open存储 with_07


PYTHON open存储 with python存储机制_PYTHON open存储 with_08

分代回收

分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容易成为垃圾的对象,提高垃圾回收的效率。

新生代对象和老年代对象

1)我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。
	2)新生代 GC 将存活了一定次数的新生代对象当作老年代对象来处理。我们把类似于这样的新生代对象上升为老年代对象的情况称为晋升(promotion)。
	3)老年代对象很难成为垃圾,所以我们对老年代对象减少执行 GC 的频率, 从而提高效率。

PYTHON open存储 with python存储机制_python_09