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

python是如何管理内存的

  • 内存
  • 2024-06-07 12:07:20
  • 3220

一、python可以做内存管理吗Python中的内存管理是通过包含所有对象和数据结构的私有堆来实现的。私有池的控制和管理是由Pythonmemorymanager实现的。
在最底层,原始内存分配器通过与操作系统的内存管理器交互,确保私有工具中有足够的空间来存储所有与Python相关的数据。
在原始内存分配器的顶部,定义了几个特定于对象的空间通过每个对象类型的属性上提到的位置。
Python内存管理器将一些工作委托给特定于对象的分配器,但确保后者在私有堆边界内运行。
堆的管理Python中是通过解释器技术实现的。用户无权控制它,即使他可以直接将对象指针指向特定的内存块,但堆空间分配实际上是由Python的内存管理器通过Python/CAPI函数来实现的。
详情可参见:


二、BAT面试题28:Python是如何进行内存管理的

Python的内存管理一般看以下三个方面:

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

2)垃圾收集机制(手动和自动),生成回收)

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

1)对象引用计数机制

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

2)垃圾收集机制

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

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

例如,一个new对象被分配给引用时,该对象的引用计数变为1。如果删除该引用并且该对象的引用计数达到0,则该对象可能会被垃圾收集。

但是减肥是昂贵且劳动密集型的。在垃圾收集期间,Python无法执行其他任务。频繁的垃圾回收会大大降低Python的工作效率。如果内存中的对象不多,则不需要一直启动垃圾回收。

所以,Python只会在特定条件下自动启动垃圾回收。Python运行时,会记录对象分配(object
allocation)和对象释放(objectdeallocation)的次数。当两者之间的差值高于某个阈值时,垃圾收集就会开始。

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

3)内存池机制

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

1内存使用malloc进行分配

2使用内存池分配小内存

Python中的内存管理机制有两套实现。一种是对于小对象来说,当大小小于256K时,pymalloc会在内存池中搜索内存空间,当大于256K时,会直接执行系统malloc行为来搜索内存空间。