PythonStudy——内存管理机制 Memory management mechanism
一、变量与对象
关系图如下:

1、变量:通过变量指针引用对象
变量指针指向具体对象的内存空间,取对象的值。
2、对象:类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)
注意:
变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。
eg:
在Python37解释器中:
In [32]: var1=object
In [33]: var2=var1 In [34]: id(var1)
Out[34]: 139697863383968 In [35]: id(var2)
Out[35]: 139697863383968
在JetBrain中:
var1 = object
var2 = var1 print(id(var1))
print(id(var2))
输出:

PS:id()是python的内置函数,用于返回对象的身份,即对象的内存地址。

在内存中:
示例1:

示例2:

示例3:
In [39]: a=123
In [40]: b=a In [41]: id(a)
Out[41]: 23242832 In [42]: id(b)
Out[42]: 23242832 In [43]: a=456 In [44]: id(a)
Out[44]: 33166408 In [45]: id(b)
Out[45]: 23242832
3、引用所指判断
通过 is 进行引用所指判断,is是用来判断两个引用所指的对象是否相同。
示例:
整数:
In [46]: a=1
In [47]: b=1
In [48]: print(a is b)
True
短字符串:
In [49]: c="good"
In [50]: d="good"
In [51]: print(c is d)
True
长字符串:
In [52]: e="very good"
In [53]: f="very good"
In [54]: print(e is f)
False
列表:
In [55]: g=[]
In [56]: h=[]
In [57]: print(g is h)
False
由运行结果可知:
1、Python缓存了整数和短字符串,因此每个对象在内存中只存有一份,引用所指对象就是相同的,即使使用赋值语句,也只是创造新的引用(在内存的栈区内创建新的内存空间),而不是对象本身(对象依然存在于堆区),id相同;
2、Python没有缓存长字符串、列表及其他对象,即使由多个相同的对象,可以使用赋值语句创建出新的对象,id不同。
查看id()的源码:

def id(* args,** kwargs):#真正的签名未知
“””
返回对象的标识。 这保证在同时存在的对象中是唯一的。
(CPython使用对象的内存地址。)
“””
通过
在 Java中获取对象的内存地址方法 如下:

二、内存池
Python中有分为大内存和小内存:(256K为界限分大小内存)
1、大内存使用malloc进行分配
2、小内存使用内存池进行分配
3、Python的内存池(金字塔)
第3层:最上层,用户对Python对象的直接操作
第1层和第2层:内存池,有Python的接口函数PyMem_Malloc实现-----若请求分配的内存在1~256字节之间就使用内存池管理系统进行分配,调用malloc函数分配内存,但是每次只会分配一块大小为256K的大块内存,不会调用free函数释放内存,将该内存块留在内存池中以便下次使用。
第0层:大内存-----若请求分配的内存大于256K,malloc函数分配内存,free函数释放内存。
第-1,-2层:操作系统进行操作

借鉴:https://www.cnblogs.com/geaozhang/p/7111961.html
PythonStudy——内存管理机制 Memory management mechanism的更多相关文章
- PythonStudy——Python 内存池机制 (Memory pool mechanism) Pymalloc
Python是如何进行内存管理-内存池机制 Pymalloc Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于对小块内存的申请和释 ...
- Android内存管理机制之一:low memory killer
转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- python的内存管理机制
先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...
- C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- Thermostat:双层存储结构的透明巨页内存管理机制
这是一篇由密歇根大学的Neha Agarwal 和 Thomas F. Wenisch,发表在计算机系统顶会ASLOS的论文,Thermostat: Application-transparent P ...
- 【JVM】5、JVM内存管理机制
转自:http://blog.csdn.net/lengyuhong/article/details/5953544 近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JV ...
- Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制
Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制 http://w ...
- Python 源码剖析(六)【内存管理机制】
六.内存管理机制 1.内存管理架构 2.小块空间的内存池 3.循环引用的垃圾收集 4.python中的垃圾收集 1.内存管理架构 Python内存管理机制有两套实现,由编译符号PYMALLOC_DEB ...
随机推荐
- linux文件管理之链接文件
文件链接 ====================================================================================软链接 或 符号链接硬 ...
- vue中关于v-for性能优化---track-by属性
vue中关于v-for性能优化---track-by属性 最近看了一些react,angular,Vue三者的对比文章,对比来说Vue比较突出的是轻量级与易上手. 对比Vue与angular,Vue有 ...
- SAP发布REST/HTTP接口
1.SE24新建类:ZCL_REST_QUERY 激活,然后添加interface:IF_HTTP_EXTENSION并激活. 2.实现IF_HTTP_EXTENSION~HANDLE_REQUEST ...
- js如何实现sign算法验证?
https://segmentfault.com/q/1010000011892180
- Sql server数据库连接Oracle库的步骤
本地使用环境 操作系统: win10 64 ,SQL Server 2012 ,Oracle Server 11g 第一步:安装好oracle客户端,并配置好TNS信息 ORCL = (DESCR ...
- 微信小程序中对于变量的定义
在页面对应的js文件中: page顶部使用let定义变量,这是定义的全局变量,在当前脚本页面,任何函数中都可以直接使用变量名调用.如果做修改,就直接使用变量等于要更改的值. 使用const定义变量,就 ...
- python_day4
昨日回顾: 1. 整型 python2 有长整型 python3 没有长整型 2.布尔值 转换 3.字符串详解 下 ...
- 第一周例行报告psp
此作业要求参见 https://edu.cnblogs.com/campus/nenu/2018fall/homework/2100 (1)psp表
- 100道Java基础面试题收集整理(附答案)
不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...
- APP加急审核
提交加急审核需要理由,一般涉及到银行信息,或者崩溃打不开这种的比较容易通过.反正苹果很苛刻,一般不给处理.如果处理第二天就可以下载最新了,省去了漫漫的等待.一个成功加急审核的借口-- We found ...