语言的内存管理是语言设计的一个重要方面. 它是决定语言性能的重要因素. 无论是 c语言 的手工管理, 还是 Java 的垃圾回收, 都成为语言最重要的特种.

以下以 python 为例, 说明一门动态语言类型的, 面向对象的语言的内存管理方式.

  1. 对象的内存使用

    赋值语句

     `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
  2. 对象引用对象

    python 中的 容器对象(container) 比如 表, 字典等, 可以包含多个对象. 实际上, 容器对象中包含的并不是元素对象本身, 是指向各个元素对象的引用.

    对象引用对象是 python 最基本的构成方式. 即使是 a=1 这一赋值方式, 实际上是让字典的一个键 "a" 的元素引用整数对象. 该字典对象用于记录所有的全局引用.

     globals()  # 查看全局引用字典.
  3. 垃圾回收

    从基本原理上,当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 为垃圾回收启动的阈值.
  4. 分代回收

    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原理 -- 内存管理的更多相关文章

  1. python学习笔记10(Python的内存管理)

      用这张图激励一下自己,身边也就只有一位全栈数据工程师!!! 32. Python的内存管理 1. 对象的内存使用 对于整型和短字符串对象,一般内存中只有一个存储,多次引用.其他的长字符串和其他对象 ...

  2. python的内存管理机制

    先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...

  3. day21(1)---python的内存管理

    垃圾回收机制: 不能被程序访问到的数据,就称之为垃圾. 引用计数:引用计数是用来记录值的内存地址被记录的次数的 每一次对值地址的引用都可以使得该值的引用计数+1 每一次对值地址的释放都可以使得该值的引 ...

  4. python的内存管理与垃圾回收机制学习

    一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对 ...

  5. python的内存管理机制(zz)

    本文转载自:http://www.cnblogs.com/CBDoctor/p/3781078.html 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计 ...

  6. Python的内存管理、命名规则、3个特性讲解

    理解变量: 变:现实世界中的状态是会发生改变的 量:衡量/记录现实世界中的状态,让计算机能够像人一样去识别世间万物(例如:一个人的身高.体重等这些信息) 为什么要变量: 程序执行的本质就是一系列状态的 ...

  7. Python深入06 Python的内存管理

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的 ...

  8. 【转】python的内存管理机制

    http://developer.51cto.com/art/201007/213585.htm 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执 ...

  9. Theano教程:Python的内存管理

    在写大型程序时候的一大挑战是如何保证最少的内存使用率.但是在Python中的内存管理是比较简单的.Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所 ...

随机推荐

  1. Android VideoView使用小记

    在Android中播放视频一般采用VideoView,当然也可以自己使用MediaPlayer+SurfaceView,但是比较麻烦.这里记录一些我使用VideoView时的疑惑 1.如何监听播放完成 ...

  2. 分针网—每日分享:HTML解析原理

    标准的web前端工程师需要知道 ◎浏览器(或者相应播放器)的渲染/重绘原理   这我得加把劲了.我还真的说的不是很清楚,我就G下,结果不是很多,找到了有一个,就记下来了...   以下部分来自hand ...

  3. Oracle的instr函数

    instr函数 instr(目标字符串,被匹配的字符串,搜索的开始位置默认是1,第几次被搜索到) 例子1: SQL> select ename,instr(ename,'L',1,1) from ...

  4. Kafka学习-Producer和Customer

    在上一篇kafka入门的基础之上,本篇主要介绍Kafka的生产者和消费者. Kafka 生产者 kafka Producer发布消息记录到Kakfa集群.生产者是线程安全的,可以在多个线程之间共享生产 ...

  5. spring boot无法启动,或者正常启动之后无法访问报404的解决办法

    以前用spring boot都是用idea的自动创建,或者是用的Jhipster创建的,就没有深究怎么去搭建.但是今天晚上心血来潮,想自己搭一个demo来整合一些技术,于是就花一点时间来手动搭.因为今 ...

  6. struts2.3.23升级到struts2.3.32

    新的漏洞 3月8号去审计厅培训系统的使用,那边计算机中心的负责人递过来一张如下图所示的文档,意思是发现了struts2的漏洞,需要进行修复. 在培训前,我登录到服务器中,看到了项目中,所有的服务器中应 ...

  7. 【less和sass的区别,你了解多少?】

    在介绍less和sass的区别之前,我们先来了解一下他们的定义: 一.Less.Sass/Scss是什么? 1.Less: 是一种动态样式语言. 对CSS赋予了动态语言的特性,如变量.继承.运算.函数 ...

  8. springcloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  9. (转)Amoeba for MySQL 非常好用的mysql集群软件

    Amoeba for MySQL Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy ...

  10. 简单的用jQuery做遮罩效果

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...