python 内存管理

原创 2015年07月07日 18:15:37

简介

python 的内存分配和回收都是自动的,用户不需要在代码中申请或释放内存。python的内存管理有两个策略,引用计数和垃圾回收。

引用计数

python内部记录了每个对象有多少个引用,即引用计数(ob_refcnt),用来跟踪对象。当对象创建是,引用计数为1。

引用计数增加

有四种方式可以增加对象的引用计数:
1,对象创建:ob = "testnewstrob"
2,对象引用赋值:ob_ref = ob
3,调用func( ob)
4,作为容器对象的一个元素,例如obs = [ob]

引用计数减少

1,对象名被显示销毁:例如 del ob
2,本地引用离开它的作用域:例如 func(ob)执行结束
3,对象的一个别名被赋值其他:例如 ob = "othervalue"
4,从容器中移除,例如obs.remove(ob)
5,包含对象引用的容器被删除,例如 del obs
可以通过getrefcount 查看引用计数,通过getrefcount看到的引用计数比实际多1,因为对象作为getrefcount函数的参数,属于增加一次引用。


当对象的引用计数为0时,表示该对象可以被回收。python中引用计数已经补充了垃圾收集,所以可以实现资源回收。但是基于引用计数的内存管理存在一个明显的问题,就是无法解决循环引用的垃圾回收。

a=[]
b=[]
a.append(b)
b.append(a)
del a
del b

由于存在循环引用,导致引用计数最后非0

垃圾回收

python 提供gc (garbage collect) 模块,解决循环应用等产生的垃圾。根据gc module的官方文档中介绍,如果用户能确定代码中不存在循环引用,甚至可以关闭gc(gc.disable())。
gc垃圾回收不同于引用计数,是根据对象是否可被访问(reachable)判断对象是否是垃圾。
a = []
b = a
del a
del b
gc.collect()



上图所示,gc.collect()并不是用来回收普通的对象析构。对于循环引用的垃圾,python使用gc实现垃圾回收。

a = []
b = []
a.append(b)
b.append(a)
del a
del b
gc.collect()



资源释放

有一些垃圾对象,gc发现其unreachable,但是不能自动删除(uncollectable)。包括一些循环引用,python不能自动判断其调用__del__()的顺序,导致无法自动free。这些对象放在gc.garbage的列表中,用户可以通过del gc.garbage[:]删除。

分代回收

python在进行垃圾回收时会终止其他任务,频繁的垃圾回收会降低python执行效率。为此python引入分代回收:在python运行过程中记录分配对象次数和回收对象次数,当二者差值超过某个阈值,会触发垃圾回收。这个阈值可以通过gc模块查看(700)。同时,python认为存在时间越长的对象成为垃圾的机会越小,将所有对象分成0,1,2三代。上图两个10代表每执行10次0代回收执行一次1代回收,没执行10次1代回收执行1次2代回收。

总结

一直对python gc存有疑惑,查了一些资料整理了一下,有错误的地方欢迎指正。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Python内存管理机制

Python内存管理机制Python内存管理机制主要包括以下三个方面: 引用计数机制 垃圾回收机制 内存池机制 引用计数举个例子说明引用是什么:a = 1如上为一个简单的赋值语句,1就是对象,a就是引...
  • AlertBear
  • AlertBear
  • 2016年03月05日 12:22
  • 2919

2.1 Python是如何进行内存管理的?

一、http://www.cnblogs.com/vamei/p/3232088.html 语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java...
  • u011860731
  • u011860731
  • 2015年07月19日 16:15
  • 991

python内存管理

起因春节期间,翻了翻《垃圾回收的算法和实现》,真是一本好书。时间比较短还没有完全看完。但是让我吃惊的时候,这是一本将垃圾回收的书,但是在它的实现篇里居然对python的内存管理有比较深入的讲解。今天有...
  • u011801189
  • u011801189
  • 2017年02月03日 17:21
  • 271

Python内存管理机制及优化简析

准备工作 为了方便解释Python的内存管理机制, 本文使用了gc模块来辅助展示内存中的Python对象以及Python垃圾回收器的工作情况. 本文中具体使用到的接口包括: gc.disa...
  • IT_YUAN
  • IT_YUAN
  • 2016年10月18日 16:45
  • 847

C、python 、java内存管理区别

一、C 一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区(...
  • u010786109
  • u010786109
  • 2014年12月07日 10:34
  • 1122

Python内存管理算法介绍

1      介绍 使用Python语言的一个好处是Python和其它一些高级语言一样,会进行自动的内存管理。它使用引用计数机制检测为对象分配的内存是否可以被释放。然而,在Python中内存永远不会...
  • qinbaby
  • qinbaby
  • 2014年04月08日 18:53
  • 2223

《python源码剖析》笔记 pythonm内存管理机制

1.内存管理架构 Python的内存管理机制都有两套实现:debug模式和release模式 Python内存管理机制的层次结构: 图16-1 第0层是操作系统提供的内存管理接口,如malloc、fr...
  • zhsenl
  • zhsenl
  • 2014年07月08日 15:17
  • 1566

深入详解python传值问题及内存管理机制

python中到底是“传引用”还是“传值”呢???        这个问题的回答是:看情况。有的是传值,有的是传引用。        判断的依据是看对象的可变性,而这一点又取决于对象的类型。故在pyt...
  • zhangweijiqn
  • zhangweijiqn
  • 2014年09月12日 21:19
  • 3149

python和java的区别(python内存管理)

python和java的区别 python如何进行内存管理
  • FourSeasonSunshine
  • FourSeasonSunshine
  • 2016年11月04日 10:11
  • 990

Python的内存管理以及垃圾回收

参考:http://www.cnblogs.com/CBDoctor/p/3781078.html 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 ...
  • onlyanyz
  • onlyanyz
  • 2015年05月09日 22:46
  • 5925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 内存管理
举报原因:
原因补充:

(最多只允许输入30个字)