Python原理 -- 内存管理
语言的内存管理是语言设计的一个重要方面. 它是决定语言性能的重要因素. 无论是 c语言 的手工管理, 还是 Java 的垃圾回收, 都成为语言最重要的特种.
以下以 python 为例, 说明一门动态语言类型的, 面向对象的语言的内存管理方式.
对象的内存使用
赋值语句
`a = 1` 数字 1 是一个对象, a 是一个引用. 利用赋值语句, 引用 a 指定对象 1 .
python 是动态类型的语言, 引用与对象分离.
id() 返回对象的内存地址.
在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。
使用 is 判断引用所指向的对象是否相同 :
a = 1
b = 1
a is b
在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。
使用 sys.getrefcount() 来查看某个对象的引用计数. *当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。*
from sys import getrefcount a = [1, 2, 3]
print(getrefcount(a)) # 2 b = a
print(getrefcount(a)) # 3
print(getrefcount(b)) # 3
对象引用对象
python 中的 容器对象(container) 比如 表, 字典等, 可以包含多个对象. 实际上, 容器对象中包含的并不是元素对象本身, 是指向各个元素对象的引用.
对象引用对象是 python 最基本的构成方式. 即使是 a=1 这一赋值方式, 实际上是让字典的一个键 "a" 的元素引用整数对象. 该字典对象用于记录所有的全局引用.
globals() # 查看全局引用字典.
垃圾回收
从基本原理上,当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。
垃圾回收时, Python 不能进行其他的任务. 频繁的来及回收将大大降低 python 的工作效率. 如果内粗怒中的对象不多就没有必要启动垃圾回收. 所有 python 只会在特定条件下, 自动启动垃圾回收. 当 python 运行时, 会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数, 当两者的差值高于某个阈值时, 启动垃圾回收.
查看 阈值 :
import gc
print gc.get_threshold() # (700, 10, 10) gc.set_threshold(700, 10, 5) # 设置 阈值. gc.collect() # 手动启动垃圾回收. 返回 (700,10,10) 中, 后面的 两个 10 与 分代回收相关的阈值, 700 为垃圾回收启动的阈值.
分代回收
Python 同时采用 分代(generation) 回收的策略.
分代回收的基本假设 : 存活时间越久的对象, 越不可能在后面的程序中变成垃圾.
我们的程序往往会产生大量的对象, 许多对象很快产生和消失, 但也有一些对象长期被使用. 出于信任和效率, 对于这样一些 "长寿" 的对象, 我们相信他们的用处, 所以减少在垃圾回收中扫描他们的频率.
Python 将所有的对象分为 0,1,2 三代. 所有的新建对象都是 0 代对象. 当某一代对象经历过垃圾回收, 依然存活, 那么, 他就被归为下一代对象. 垃圾回收启东时, 一定会扫描所有的 0 代对象. 如果 0 代经过一定次数垃圾回收, 那么就启动对 0 代和 1 代的扫描清理. 当 1 代也经历了一定次数的垃圾回收, 那么启动对 0,1,2 , 即所有对象进行扫描. 这两个 次数 就是上面 get_threshold() 返回的 (700,10,10) 后面的两个10, 即 每 10 次 0 代垃圾回收, 会配合 1 次 1 代的垃圾回收, 而每 10 次 1 代的垃圾回收, 才会有 1 次 2 代垃圾回收. 可以通过 gc.set_threshold() 来调整.
Python采取了一种相对简单的垃圾回收机制,即引用计数,并因此需要解决孤立引用环的问题。
Python原理 -- 内存管理的更多相关文章
- python学习笔记10(Python的内存管理)
用这张图激励一下自己,身边也就只有一位全栈数据工程师!!! 32. Python的内存管理 1. 对象的内存使用 对于整型和短字符串对象,一般内存中只有一个存储,多次引用.其他的长字符串和其他对象 ...
- python的内存管理机制
先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...
- day21(1)---python的内存管理
垃圾回收机制: 不能被程序访问到的数据,就称之为垃圾. 引用计数:引用计数是用来记录值的内存地址被记录的次数的 每一次对值地址的引用都可以使得该值的引用计数+1 每一次对值地址的释放都可以使得该值的引 ...
- python的内存管理与垃圾回收机制学习
一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对 ...
- python的内存管理机制(zz)
本文转载自:http://www.cnblogs.com/CBDoctor/p/3781078.html 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计 ...
- Python的内存管理、命名规则、3个特性讲解
理解变量: 变:现实世界中的状态是会发生改变的 量:衡量/记录现实世界中的状态,让计算机能够像人一样去识别世间万物(例如:一个人的身高.体重等这些信息) 为什么要变量: 程序执行的本质就是一系列状态的 ...
- Python深入06 Python的内存管理
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的 ...
- 【转】python的内存管理机制
http://developer.51cto.com/art/201007/213585.htm 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执 ...
- Theano教程:Python的内存管理
在写大型程序时候的一大挑战是如何保证最少的内存使用率.但是在Python中的内存管理是比较简单的.Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所 ...
随机推荐
- postgres导入其他数据库数据
最近对postgres数据库进行深入研究,将原来项目中使用的sqlserver数据库中的数据表导入postgres,网上搜索postgres数据导入,除空间数据库可以通过PostGIS 2.0 Sha ...
- Android 窗口全屏
全屏getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 取消全屏 getWindow().clearFlags(Wind ...
- Android VideoView使用小记
在Android中播放视频一般采用VideoView,当然也可以自己使用MediaPlayer+SurfaceView,但是比较麻烦.这里记录一些我使用VideoView时的疑惑 1.如何监听播放完成 ...
- 分针网—IT教育: jquery选择器的用法
jQuery选择器是jQuery库的一大特色,用这些选择器不但可以省去繁琐的JavaScript 书写方式,还可以节省时间和效率,正是有这些jQuery选择器,才让我们更容易的操作JavaScript ...
- hdu2612 Find a way BFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 思路: 裸的BFS,对于Y,M分别进行BFS,求出其分别到达各个点的最小时间: 然后对于@的点, ...
- Spring事务处理
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 数据库向用户提供保存当前程序状态的方法,叫事务提交(commit): ...
- robotframe 学习笔记(之一)
在robot framework中,通过 Set variable关键字来定义变量 连接对象: 通过Catenate关键字可以连接多个信息 加上"SEPARATOR=",可以对多个 ...
- NIO原理剖析与Netty初步----浅谈高性能服务器开发(一)
除特别注明外,本站所有文章均为原创,转载请注明地址 在博主不长的工作经历中,NIO用的并不多,由于使用原生的Java NIO编程的复杂性,大多数时候我们会选择Netty,mina等开源框架,但理解NI ...
- 发布自己第一个npm 组件包(基于Vue的文字跑马灯组件)
一.前言 总结下最近工作上在移动端实现的一个跑马灯效果,最终效果如下: 印象中好像HTML标签的'marquee'的直接可以实现这个效果,不过 HTML标准中已经废弃了'marquee'标签 既然HT ...
- [原创]MySQL数据库忘记root密码解决办法
MySQL数据库忘记root密码解决办法 1.在运行输入services.msc打开服务窗体,找到MYSQL服务.右键停止将其关闭.如图: