python的内存管理与垃圾回收机制学习
一、python内存申请:
1、python的内存管理分为六层:最底的两层有OS控制。第三层是调用C的malloc和free等进行内存控制。第四层第五层是python的内存池。最上层使我们接触的直接对python对象进行操作。
2、python申请对象时候小于256Byte的字节申请回直接使用python自己的内存分配系统,当大于256Byte的时候会调用malloc直接分配一个256k的大内存空间。释放内存空间时候会回收到内存池中而不是直接调用free释放掉。
3、深浅拷贝的不同(id☞内存地址):
(1)深拷贝(基本数据类型:整型、浮点、字符串、元祖、列表等)【a=x ; b=a ; a变b不变的情况】一个变化后两者id就不一样了,之前是一样的。(会新增一块地址)
Python 2.7. (default, Dec , ::) [MSC v. bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a =
>>> b = a
>>> id(a)
6579496L
>>> id(b)
6579496L
>>> a =
>>> id(a)
6579472L
>>> id(b)
6579496L
>>>
(2)浅拷贝(数据结构数据类型:字典等)【a=x ; b=a ; a变b也变的情况】一个变化后两者id仍然一样,之前是一样的,且修改前后id不变。(不会新增一块地址)
Python 2.7. (default, Dec , ::) [MSC v. bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [,,]
>>> b = a
>>> id(a)
45528520L
>>> id(b)
45528520L
>>> a = [,,,]
>>> id(a)
45643272L
>>> id(b)
45528520L
>>> a
[, , , ]
>>> b
[, , ]
>>> a = {"a":,"b":}
>>> b = a
>>>
>>>
>>> id(a)
45672376L
>>> id(b)
45672376L
>>> a["a"] =
>>> id(a)
45672376L
>>> id(b)
45672376L
>>> b
{'a': , 'b': }
>>>
二、python的垃圾回收机制:
1、首先python垃圾回收机制是以引用计数为主,划代分类为辅。
2、引用计数:当有一个对象引用了目标对象,目标对象引用计数就加一。反向操作则引用计数减一,当引用计数为0时候则删除对象。
3、类对象和基本数据类型对象的(析构函数)__del__:
class A:
def __init__(self):
print "create object"
def __del__(self):
print "delete object" # a = A()
# del a
#其他类型:
#a = 10
#b = "ssss"
#del a
#del b
4、引用计数+1情况:
(1)对象被创建,例如
a=23
(2)对象被引用,例如
b=a
(3)对象被作为参数,传入到一个函数中,例如
func(a)
(4)对象作为一个元素,存储在容器中,例如
list1=[a,a]
5、引用计数-1的情况:
(1)对象的别名被显式销毁,例如
del a
(2)对象的别名被赋予新的对象,例如
a=24
(3)一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
(4)对象所在的容器被销毁,或从容器中删除对象
6、注明:
函数调用变量A,A的引用计数+2 因为还有一步传参。
7、gc模块
#引用lib文件
import gc #gc模块文件 is_enable()=True才会启动垃圾自动回收
import sys gc.set_debug(gc.DEBUG_STATS|gc.DEBUG_LEAK)#打开gc模块调试信息 #获取目标对象的引用计数
a = []
b = a
print sys.getrefcount(a)
print sys.getrefcount(b) gc.collect(para) #返回unreachable对象的个数。循环应用的引用计数非0,但是也是垃圾,呗收入gc.garbage但是不删除。
#para = 0,1,2 0检查第一代对象 1检查一、二代对象 2检查一、二、三代对象。 gc.set_threshold(threshold0[,threshold1[,threshold2]])#自动执行垃圾回收的频率
gc.get_count()#获取当前自动执行垃圾回收的计数器,长度为3的一个list #垃圾回收有一个阈值 假设阈值(700,10,10)那么到了(699+1,x,x)时候就会启动。
8、参考资料(鸣谢):
http://www.cnblogs.com/Xjng/p/5128269.html
http://blog.csdn.net/yueguanghaidao/article/details/11274737
http://www.cnblogs.com/CBDoctor/p/3781078.html
python的内存管理与垃圾回收机制学习的更多相关文章
- Python的内存管理和垃圾回收机制
内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
- JVM内存管理和垃圾回收机制介绍
http://backend.blog.163.com/blog/static/20229412620128233285220/ 内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...
- V8 内存管理和垃圾回收机制总结
这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...
- 【第1题】 Pythonn内存管理以及垃圾回收机制
内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...
- JVM的生命周期、体系结构、内存管理和垃圾回收机制
一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...
- java基础(一):谈谈java内存管理与垃圾回收机制
看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...
- JavaScript 执行环境、作用域、内存管理及垃圾回收机制
前言 JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. [原理]找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔( ...
- PHP 内存管理及垃圾回收机制
PHP5的内存管理 对象传递 PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval). ...
随机推荐
- Java NIO使用及原理分析(二)(转)
在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如 ...
- [LintCode]删除链表中的元素
问题分析: 声明当前指针和上一个指针即可. 问题求解: public class Solution { public ListNode removeElements(ListNode head, in ...
- iOS边练边学--UITableView性能优化之三种方式循环利用
一.cell的循环利用方式1: /** * 什么时候调用:每当有一个cell进入视野范围内就会调用 */ - (UITableViewCell *)tableView:(UITableView *)t ...
- Cracking the coding interview--Q3.1
题目 原文: Describe how you could use a single array to implement three stacks. 译文: 你如何只用一个数组实现三个栈? 解答 我 ...
- RRD.so文件 rrdruby
ubuntu 12.04绑定rrdruby gem install librrd 用来装rrdruby,这样才能找到RRD.so文件然后在rb文件中加入这两句话: $: << '/path ...
- CSS3加载动画
图1 通常我们都使用gif格式的图片或者使用Ajax来实现诸如这类的动态加载条,但是现在CSS3也可以完成,并且灵活性更大. 选1个例子看看怎么实现的吧: 效果图: 图2 代码: 使用1个名为'l ...
- 12款优秀jQuery Ajax分页插件和教程
在这篇文章中,我为大家收集了12个基于 jQuery 框架的 Ajax 分页插件,这些插件都提供了详细的使用教程和演示.Ajax 技术的出现使得 Web 项目的用户体验有了极大的提高,如今借助优秀的 ...
- C++/C语言的标准库函数与运算符的区别new/delete malloc/free
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...
- 关于Cocos2d-x的数据存储
Cocos2d-x对数据的存储没有用到数据库,但是有用到一个类似数据库的小型数据库,就是数据存储.存储后的数据用XML的文件格式保存在C:\Users\Administrator\AppData\Lo ...
- SSH远程登录其他机器
常用格式:ssh [-l login_name] [-p port] [user@]hostname更详细的可以用ssh -h查看. 不指定用户: ssh 192.168.0.11 指定用户: ssh ...