01.14 - 内存管理

内存管理

  • 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]))

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,911评论 1 32
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,107评论 1 16
  • 内存管理的原理? 内存空间总共有8块区域,有两个区域需要特别注意,一个就是堆空间,一个就是栈空间。栈里存放临时变量...
    Carden阅读 3,352评论 0 1
  • 11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什...
    AlanGe阅读 4,143评论 1 4
  • 为什么管理内存: 程序在运行的时候,要创建大量的对象,这些对象放在堆和栈上。(基本类型放在栈上,由系统自动管理。)...
    我是谁重要吗阅读 5,244评论 0 12

友情链接更多精彩内容