python内存管理

  • python是动态类型,对象是用于存储数据。在python中,各种数字,字符串,列表,字典都是对象,相当于java的变量
  • 引用,python程序中写的对象名,指向对象
  • 引用和对象分离,是动态类型的核心
Python是怎样管理内存

Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为Python的heap空间分配内存是由Python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。Python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用。

a= 3      #a是引用,指向对象3.     3是存储内存中的一个整数对象
引用计数
x=3.14
y=x
Paste_Image.png

如图,内存创建一个浮点型对象-3.14,然后将引用x指向于对象3.14,对象3.14的引用计数就是1,语句y=x,则是创建了一个指向同一个对象的引用别名y,同时对象3.14的引用计数就是2.

x=3.14
y=x
x=4
y=5

上面的对象3.14的引用计数是0,会被清空


Paste_Image.png
python内存池机制
Paste_Image.png

第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的地址变得不再相同

Paste_Image.png
python 垃圾回收机制

python的垃圾回收以引用计数为主,标记-清除和分代收集为辅。print gc.collect()可以看到python的垃圾

python中到底是“传引用”还是“传值”呢

python中根据对象的可变性来取决于“传引用”还是“传值”。对象的可变性取决于对象类型

  • 基本类型(整型),字符串、元组 属于不可变对象
  • 列表、字典、类以及类的实例 属于可变对象

本文引用:
http://www.cnblogs.com/CBDoctor/p/3781078.html
http://www.jianshu.com/p/6226016cb327

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在比较浅层次上我们通过说明如下问题来进一步深入了解python内存管理机制:Python中到底是“传引用”还是“传...
    tdeblog阅读 2,508评论 0 0
  • 虽然很早知道python是利用引用计数来进行内存管理,但是具体的细节并不明白,网上查了查相关资料,整理一下 查询引...
    核桃啊阅读 723评论 0 1
  • 内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于 存储计算数据,而大部...
    dreamer_lk阅读 1,253评论 2 10
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,631评论 1 118
  • 虽然不爱了,但还是小心眼。这话怎么讲?是这样的:2016年3月15日发了女朋友的照片,当时的我内心想法特简单,得不...