当前位置:首页 > 内存 > 正文

python内存管理机制

  • 内存
  • 2024-06-09 06:18:39
  • 1587

一、Python如何进行内存管理

Python内存管理一般考虑以下三个方面:

1)对象引用计数机制(四自增五自减)

2)对象引用计数机制垃圾回收(手动和自动、分代回收)

3)内存池机制(大m,小p)

1)对象引用计数机制

要在Python中跟踪内存对象,可以使用引用计数的简单技术。count(a)可以检查对象a的引用计数,但是比正常计数大1,因为调用函数时传递了a,这会让a的引用计数增加1

2)废物收集机制

吃多了总会发胖,Python也是如此。随着Python中的对象越来越多,它们会占用越来越多的内存。但你不必太担心Python的大小,它会在适当的时候“减肥”,启动垃圾收集(garbage
collection)并删除不需要的对象

。一个基本原理,当Python中某个对象的引用计数下降到0时,就意味着没有引用指向该对象,该对象就成为垃圾被回收

例如,a如果对象再次被分配引用,该对象的引用计数变为1。如果删除该引用,该对象的引用计数达到0,则该对象可以被垃圾收集。

然而,减肥是昂贵且费力的。在垃圾收集期间,Python无法执行任何其他任务。频繁的垃圾回收会大大降低Python的工作效率。如果内存中的对象不多,则没有必要总是启动垃圾回收。

所以Python只有在特定条件下才会自动启动垃圾回收。当Python运行时,对象分配(object
allocation)和对象释放(objectdeallocation)的数量将被记录。当两者之差超过一定阈值时,就会开始垃圾收集。

我们可以通过gc模块的get_threshold()方法查看阈值。

3)内存池机制

Python分为大内存和小内存:(256K是大小内存的限制)

1个malloc内存分配用途

2.使用内存池分配小内存

Python中内存管理机制有两套实现方式一套是针对小对象的,即当大小小于256K时,pymalloc会申请内存空间内存池;当大于256K时,将直接执行系统malloc行为来申请内存空间;


二、Python如何管理内存Python中的内存管理是从三个方面进行的:一是对象的引用计数机制,二是垃圾回收机制,三是内存池机制
1.对象的引用计数机制Python内部使用引用计数来跟踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1为对象指定新名称
2将其放入容器(例如列表、元组或字典)
引用计数减少-情况:
1。使用del语句显式销毁对象别名
2引用超出其范围或被重新赋值
count()函数可以检索当前引用。对象的计数
在大多数情况下,引用计数比您想象的要大得多。对于不可变数据(例如数字和字符串),解释器在程序的不同部分之间共享内存以节省内存。
2垃圾收集
1当对象的引用计数达到零时,将由垃圾收集机制进行处理。
2.当两个对象a和b相互引用时,sub语句可以减少a和b的引用计数并销毁用于引用底层对象的名称。但是,由于每个对象都包含对其他对象的应用程序,因此引用计数不会重置为零,并且该对象也不会被销毁。(这会导致内存泄漏)。为了解决这个问题,解释器定期执行循环检测器,搜索具有不可用对象的循环并将其删除。
3.内存池机制
Python为内存提供了垃圾回收机制,但它会将未使用的内存放入内存池中,而不是返回给操作系统。
oc机制。为了加快Python的执行效率,Python引入了内存池机制来管理小内存的申请和释放。
中所有小于256字节的对象都使用pymalloc实现的分配器,而大对象则使用系统的malloc。
对象,例如整数、浮点数和列表,都有自己独立的私有内存池,并且它们的内存池在对象之间不共享。这意味着,如果分配和释放大量整数,则用于缓存这些整数的内存将无法再分配给浮点数。
三、python基于值的内存管理方式是什么?Python使用基于值的内存管理模型。
Python中的一切都是对象,变量存储对对象的引用。对于Python语言来说,对象类型和内存是在运行时确定的。这就是为什么我们称Python语言为动态类型(这里,动态类型将内存地址分配给变量,它会在运行时自动确定变量的类型并为变量赋值)。