时间:2021-05-23
概述
在Python中,内存管理涉及到一个包含所有Python对象和数据结构的私有堆(heap). 这个私有堆的管理由内部的Python内存管理器保证。Python内存管理器有不同的组件来处理各种动态存储管理方面的问题,如共享,分割,预分配或缓存。
在最底层,一个原始内存分配器通过与操作系统的内存管理器交互,确保私有堆有足够的空间来存储所有与Python相关的数据。在原始内存分配器的基础上,几个对象特定的分配器在同一个堆上运行,并根据每种对象类型的特点实现不同的内存管理策略。例如,整数对象在堆内的管理方式不同于字符串,元祖,或者字典。因为整数需要不同的存储需求和速度与空间的权衡。因此,Python内存管理器将一些工作分配给对象特定分配器,但确保后者在私有堆的范围内运行。
Python堆内存的管理由解释器来执行,用户对他没有控制权,即使他们经常操作只想堆内存块的对象指针,理解这一点非常重要。Python对象和其他内部缓冲区的堆空间分配是由Python内存管理器按需通过本文档中列出的Python/C API函数进行的。
Python的内存管理总共分为4层(Layer0-3)
第一层Layer1的仅仅是对malloc的简单包装, raw memory,目的是为了兼容各个操作系统,因为不同的操作系统调用malloc的时候可能会有不同的行为结果;第二层Layer2是内存管理机制的核心,其中gc就是在这一层发挥至关重要的作用。第三层,是对象缓冲池,如Python对一些对象的直接操作,包括int,list等
对于可能被经常使用,而且是immutable的对象,如bool类型,元祖类型,小的整数,长度较短的字符串等,Python会缓存在layer3,直接供Python调用,避免频繁的创建和销毁。'
当一个对象逻辑上不被使用了,但并没有被释放,那么就存在内存泄漏,很可能会造成程序效率低下甚至崩溃
Python分配内存的时候又分为大内存和小内存,大内存以256字节为界限,对于大内存使用Malloc进行分配,而对于小内存则使用内存池进行分配,由于小内存的分配和释放是频繁的,因此内存池的使用大大提高了Python的执行效率。
在Python中大多数对象的生命周期都是通过引用计数来管理的,引用技术也是一种最直观最简单的垃圾收集技术
每个Python对象都有一个引用计数器,用于记录多少变量指向这个对象,可以通过sys模块的getrefcount查询获得
每一个对象都会维护一个引用计数器,当一个对象被引用的时候,它的计数器就+1,当一个对象的引用被销毁的时候,计数器-1,当这个对象的引用计数为0的时候,说明这个对象已经没有使用了,可以被释放,就会被回收,具有实时性。由于引用计数需要维护计数器等额外的操作,为了与引用计数搭配,在内存的分配和释放上获得最高的效率,Python因此设计了大量的内存池机制。
下面这些情况引用计数+1
(1). 对象被创建: a = 4
(2). 引用被复制: y = x
(3). 被作为参数传递给函数: f(x)
(4). 作为容器对象的一个元素: a = [1, x]
下面这些情况引用计数-1
(1). 离开作用域,比如f(x)函数结束的时候,x只想的对象引用减1
(2). 引用被显式地销毁: del x
(3). 对象的一个别名被赋值给其他对象: y = 1
(4). 对象从一个容器对象中移除: l.remove(x)
(5). 容器对象本身被销毁: del l
Python的内存管理主要以引用计数为主,引用计数机制能释放大部分无用对象,除了第一种情况,循环引用,因为循环引用的对象那个引用计数器永不为0。
循环引用,就是一个对象直接或者间接引用自己本身,导致计数器不为0
以上就是Python 内存管理机制全面分析的详细内容,更多关于python 内存管理机制的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
简单来说python的内存管理机制有三种1)引用计数2)垃圾回收3)内存池接下来我们来详细讲解这三种管理机制1,引用计数:引用计数是一种非常高效的内存管理手段,
###概述GC作为现代编程语言的自动内存管理机制,专注于两件事:1.找到内存中无用的垃圾资源2.清除这些垃圾并把内存让出来给其他对象使用。在Python中,它在
引言随着计算需求规模的不断增大,应用程序对内存的需求也越来越大。为了实现虚拟内存管理机制,操作系统对内存实行分页管理。自内存“分页机制”提出之始,内存页面的默认
python内存管理机制:引用计数垃圾回收内存池1.引用计数当一个python对象被引用时其引用计数增加1;当其不再被变量引用时引用计数减1;当对象引用计数等于
在Windows10May2020(20H1/Version2004)更新中,微软引入了名为“堆内存(SegmentHeap)”的内存管理机制,能将新版Micr