本文较为详细的分析了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 内存分析_python内存管理分析相关推荐

  1. python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  2. python 内存溢出_python内存溢出

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这里整理了一次内存泄漏的问题通常我们写python程序的时候也很少关注内存这个问 ...

  3. python多线程内存溢出_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  4. 如何用python进行相关性分析_Python文章相关性分析---金庸武侠小说分析

    最近常听同事提及相关性分析,正巧看到这个google的开源库,并把相关操作与调试结果记录下来. 小说集可以百度<金庸小说全集 14部>全(TXT)作者:金庸 下载下来. 需要整理好格式,门 ...

  5. python 小说人物分析_Python文章相关性分析---金庸武侠小说分析

    最近常听同事提及相关性分析,正巧看到这个google的开源库,并把相关操作与调试结果记录下来. 小说集可以百度<金庸小说全集 14部>全(TXT)作者:金庸 下载下来. 需要整理好格式,门 ...

  6. python内存池_python内存监控工具memory_profiler和guppy的用法详解

    python内存监控工具memory_profiler和guppy的用法详解 发布时间:2020-08-21 19:44:58 来源:脚本之家 阅读:123 python2.7在内存管理上相比pyth ...

  7. python 去空_Python 内存分配时的小秘密

    (给Python开发者加星标,提升Python技能) 作者:豌豆花下猫 (本文来自作者投稿) Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解 ...

  8. python找房源_Python租房信息分析!找到最适合自己的房源信息!

    原标题:Python租房信息分析!找到最适合自己的房源信息! 租房信息分析 import numpy as np import pandas as pd import matplotlib.pyplo ...

  9. python清空列表_Python 内存分配时的小秘密

    (给Python开发者加星标,提升Python技能) 作者:豌豆花下猫 (本文来自作者投稿) Python 中的sys模块极为基础而重要,它主要提供了一些给解释器使用(或由它维护)的变量,以及一些与解 ...

最新文章

  1. MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
  2. 小程序中获取高度以及设备的方法
  3. Solo 博客系统 1.7.0 发布 - 新版 MD 编辑器
  4. 缓慢渐变维度的处理方式
  5. 兄dei,Python数据竞赛和5万现金奖励了解一下
  6. Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
  7. Java虚拟机(八)——堆
  8. MySQL影响性能的因素
  9. Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
  10. 武汉理工计算机专考研专业课,2017武汉理工大学考研计算机专业课真题
  11. 微机实验报告7 定时/计数器应用实验
  12. JAVA API (application programming interface)
  13. 注册表方法删除WINDOWS右键多余扩展项
  14. Word文档中批量修改英文、中文或数字等的字体和格式的方法
  15. 嵌入式linux检测U盘拔插
  16. HarmonyOS DevEco Studio版本更新
  17. python中repr方法_理解Python中的repr()函数 - 程序园
  18. 关于标准电阻阻值的说明(E6、E12、E24、E48、E96、E192)
  19. BI领导驾驶舱-企业管理者不可或缺的决策帮手
  20. PrimeTime基础命令:get_pins

热门文章

  1. LeetCode 143. 重排链表(链表反转+快慢指针)
  2. LeetCode 382. 链表随机节点(概率)
  3. django简介及环境搭建
  4. 数据库实例:mysql与mongo结合用户登录
  5. SparkContext解析
  6. Android设置text按钮,安卓基础控件使用(TextView、Button、ImageView、EditText)
  7. php 负载监控_php记录服务器负载、内存、cpu状态的代码
  8. python 生成html文件浏览器_Handout库:能将python脚本转化为html展示文件
  9. laravel 判断字符串包含_laravel 字符串操作大全
  10. sql两个时间之间的小时差_2年级学生每天上学路上有两个小时车程,该如何利用好这个时间?-知乎亲子热点快报/2020/09/04...