python内存管理分析

作者:huaweitman 时间:2022-04-16 22:03:03 

本文较为详细的分析了python内存管理机制。分享给大家供大家参考。具体分析如下:

内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理。

小块空间的内存池

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。

python内存管理分析

Python内存池全景

这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。这也就是之前提到的Pymalloc机制。

在Python 2.5中,Python内部默认的小块内存与大块内存的分界点定在256个字节,这个分界点由前面我们看到的名为SMALL_REQUEST_THRESHOLD的符号控制。

也就是说,当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。

在一个对象的引用计数减为0时,与该对象对应的析构函数就会被调用。

但是要特别注意的是,调用析构函数并不意味着最终一定会调用free释放内存空间,如果真是这样的话,那频繁地申请、释放内存空间会使 Python的执行效率大打折扣(更何况Python已经多年背负了人们对其执行效率的不满)。一般来说,Python中大量采用了内存对象池的技术,使用这种技术可以避免频繁地申请和释放内存空间。因此在析构时,通常都是将对象占用的空间归还到内存池中。

"这个问题就是:Python的arena从来不释放pool。这个问题为什么会引起类似于内存泄漏的现象呢。考虑这样一种情形,申请10*1024*1024个16字节的小内存,这就意味着必须使用160M的内存,由于Python没有默认将前面提到的限制内存池的WITH_MEMORY_LIMITS编译符号打开,所以Python会完全使用arena来满足你的需求,这都没有问题,关键的问题在于过了一段时间,你将所有这些16字节的内存都释放了,这些内存都回到arena的控制中,似乎没有问题。

但是问题恰恰就在这时出现了。因为arena始终不会释放它维护的pool集合,所以这160M的内存始终被Python占用,如果以后程序运行中再也不需要160M如此巨大的内存,这点内存岂不是就浪费了?"

Python内存管理规则:del的时候,把list的元素释放掉,把管理元素的大对象回收到py对象缓冲池里。

希望本文所述对大家的Python程序设计有所帮助。

标签:python,内存
0
投稿

猜你喜欢

  • Python 实现「食行生鲜」签到领积分功能

    2023-02-25 16:26:00
  • python数字图像处理实现直方图与均衡化

    2021-04-01 14:44:59
  • Python字符串中查找子串小技巧

    2022-04-16 10:58:04
  • Python实现普通图片转ico图标的方法详解

    2023-08-13 07:09:36
  • 解决pip install 卡住不动的问题

    2021-06-16 16:25:13
  • 淘宝网获亚洲最佳在线客户体验大奖

    2009-03-31 12:55:00
  • javascript动态添加单元格的脚本代码

    2023-09-02 05:21:26
  • Python最长公共子串算法实例

    2022-08-11 01:29:57
  • Python-while 计算100以内奇数和的方法

    2022-03-24 12:00:39
  • 在ASP编程中nothing代表什么意思?

    2011-04-15 10:47:00
  • JavaScript Memoization

    2008-05-01 12:48:00
  • 对Python w和w+权限的区别详解

    2022-11-30 09:40:15
  • 设计提升满意度

    2010-05-16 15:00:00
  • Python命令行定时任务自动化工作流程

    2023-01-01 20:52:51
  • PyTorch 解决Dataset和Dataloader遇到的问题

    2023-10-14 04:37:50
  • python实现简易聊天室(Linux终端)

    2022-03-30 09:44:01
  • 文字超长自动省略,以...代替,CSS实现

    2009-07-16 10:15:00
  • 在Django中Pyecharts生成图表实现

    2023-07-27 08:16:32
  • python实现集中式的病毒扫描功能详解

    2022-03-04 03:16:00
  • 如何通过python检查文件是否被占用

    2023-03-20 12:25:00
  • asp之家 网络编程 m.aspxhome.com