Python内存管理机制
来源:互联网 发布:大学男生背包推荐 知乎 编辑:程序博客网 时间:2024/06/02 18:54
一、python内存
因为要调用while循环,循环内有temp变量,不清楚python是否会在每一轮循环结束后自动释放temp内存空间,做了一个内存测试,发现无论temp = none,还是del temp,只能销毁变量,无法完全释放内存空间。注:红色部分标出相同内存id。
>>> for i in range(3):temp = iprint temp,id(temp)0 36666732
1 36666720
2 36666708
>>> for i in range(4,7):<span style="white-space:pre"></span>temp = i<span style="white-space:pre"></span>print temp,id(temp)<span style="white-space:pre"></span>temp = None4 36666684
5 36666672
6 36666660
>>> for i in range(7,10):temp = iprint temp,id(temp)del temp7 36666648
8 36666636
9 36666624
>>> a = 1>>> id(a)36666720
>>> b = 5>>> id(b)36666672
>>> c = 8>>> id(c)36666636
测试完毕后删除c可以看到,变量c和temp确实被销毁,只是他们指向的引用值仍然会在内存中存在。直至窗口关闭才自动释放,人工无法干预。
>>> del c
>>> id(c)Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> id(c)NameError: name 'c' is not defined>>> id(temp)Traceback (most recent call last): File "<pyshell#15>", line 1, in <module> id(temp)NameError: name 'temp' is not defined>>> id(5)36666672>>> id(10)36666612>>> id(100000)41708736>>> id("1234")46118528>>> d = "1234">>> id(4)36666684
二、内存池机制
查看了相关的博客,更深一步了解python内存机制
Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作,
第0层是C中的malloc,free等内存分配和释放函数进行操作;
第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;
第3层是最上层,也就是我们对Python对象的直接操作;
在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:
如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc.
这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.
经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同
而对于像字典(dict),列表(List)等,改变一个就会引起另一个的改变,也称之为浅拷贝
附:
引用计数增加
1.对象被创建:x=4
2.另外的别人被创建:y=x
3.被作为参数传递给函数:foo(x)
4.作为容器对象的一个元素:a=[1,x,'33']
引用计数减少
1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
2.对象的别名被显式的销毁:del x ;或者del y
3.对象的一个别名被赋值给其他对象:x=789
4.对象从一个窗口对象中移除:myList.remove(x)
5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。
垃圾回收
1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。
参考:
[1] Python 2.7.8 documentation memory management
[2]深入详解python传值问题及内存管理机制-CSDN
[3]Python内存池管理与缓冲池设计 - 张知临的专栏
[4]理解python变量和内存管理
- Python中的内存管理机制
- 解读Python内存管理机制
- 解读Python内存管理机制
- 解读Python内存管理机制
- 解读Python内存管理机制
- python的内存管理机制
- Python内存管理机制
- python的内存管理机制
- Python内存管理机制
- Python内存管理机制
- python的内存管理机制
- Python内存管理机制
- python的内存管理机制
- python的内存管理机制
- python的内存管理机制
- Python内存管理机制
- python的内存管理机制
- Python的内存管理机制
- working copy locked
- 转:对java中int与Integer的一些理解
- 重温java基础
- 三个数排序。要求输入三个整数,按逗号隔开,把它们从小到大排列,输出结果用空格隔开。
- 嵌套类
- Python内存管理机制
- MQX中的定时器
- SerDes interface参考设计_设计功能模块(6)
- Item 15:资源管理类需要提供对原始资源的访问 Effective C++笔记
- xcode模拟器 键盘不能输入中文--解决之道
- iframe的跨域问题
- 2014华为机考题笔记
- 黑马程序员——java基础——Java中对字符串的操作
- svn maven 打包