美文网首页
01.14 - 内存管理

01.14 - 内存管理

作者: xxxQinli | 来源:发表于2019-01-14 17:22 被阅读0次

内存管理

  • 1. 数据的存储

内存分为栈区间和堆区间,从底层看,栈区间的内存的开辟与释放是系统自动管理的,堆区间的内存是由程序员通过代码开辟(malloc方法)和释放的

从python语言角度,栈区间的内存的开辟和释放是系统自动管理的,堆区间的内存管理也已经封装好里,程序员不需要写代码来开辟空间与释放空间

python中变量本身是存在栈区间的,函数调用过程是在栈区间

对象都是存在堆区间的(python中所有的数据都是对象)

变量赋值的过程,先在堆区间开辟空间将数据存起来,然后将数据对应的地址存到栈区间的变量中,python所有的变量都存地址

数字和字符串比较特殊,赋值的时候不会直接开辟空间,而是先检测内存缓冲区间有没有存储过这个数据,如果有就用之前的

除了数字和字符串,其他都是直接开辟新的内存空间

  • 2. 内存释放(垃圾回收机制)- 掌握原理及注意 - 重点

python中的每个对象在创建的时候都有一个属性,叫引用技术,代表当前对象引用的个数。判断一个对象是否销毁就看对象的引用计数是否为0

为0的销毁,不为0的就不销毁

垃圾回收机制,不定时的查看对象的引用计数是否为0,但并不是变为0就马上销毁,因为检测是不定时的

引用计数:对象的地址被多少个变量存了

调用函数将实参传入函数, 会临时增加引用计数。因为函数会在栈区间中临时开辟一个空间来存储局部变量

getrefcount函数:

getrefcount(对象) -> 获取对象的引用计数

使用不同的变量存对象的地址会增加引用计数

要释放一个数据,改变变量的地址,或者直接del掉变量


from sys import getrefcount

list1 = [1, 2]
[1, list1] #-> 这个数据一出生就会销毁,因为没有将地址存入变量,所以引用计数为0
a = list1
print(getrefcount(list1)) # 结果为2 ----重点,obj临时存了一次地址
print(getrefcount([1.2]))

相关文章

  • 01.14 - 内存管理

    内存管理 1. 数据的存储 内存分为栈区间和堆区间,从底层看,栈区间的内存的开辟与释放是系统自动管理的,堆区间的内...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • 第10章 内存管理和文件操作

    1 内存管理 1.1 内存管理基础 标准内存管理函数堆管理函数虚拟内存管理函数内存映射文件函数 GlobalMem...

  • 01.14

    总有一天,会有一个人, 看你写过的所有状态,读完写的所有微博,看你从小到大的所有照片,甚至去别的地方寻找关于你的信...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • JavaScript —— 内存管理及垃圾回收

    目录 JavaScript内存管理内存为什么需要管理?内存管理概念JavaScript中的内存管理JavaScri...

  • OC - OC的内存管理机制

    导读 一、为什么要进行内存管理 二、内存管理机制 三、内存管理原则 四、MRC手动内存管理 五、ARC自动内存管理...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

网友评论

      本文标题:01.14 - 内存管理

      本文链接:https://www.haomeiwen.com/subject/rhejdqtx.html