社区编辑申请
注册/登录
解读Python内存管理机制
开发 后端
内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理。

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

51CTO推荐阅读:对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对象缓冲池里。

【编辑推荐】

  1. 奇妙的流控制 Python中的迭代器与生成器
  2. Python闭包的概念、形式与应用
  3. 使用Python轻松收集Web站点数据
  4. 加速程序开发 Python整合C语言模块
  5. 对Python特色的详细介绍

 

责任编辑:王晓东 来源: 网络转载
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-05-03 22:25:57

Python浏览器语言

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-05-10 16:04:40

编程语言PythonC语言

2022-05-20 14:54:33

数据安全数字化转型企业

2022-05-25 07:11:13

2022-04-13 18:40:59

Python开发

2022-05-07 07:26:05

PyScriptHTMLPython 代码

2022-05-02 16:27:01

JavaScriptHTMLPython

2022-05-17 09:14:50

聚类算法python

2022-05-14 08:05:18

Linux内存管理

2022-05-03 23:44:21

Python动态链接库Ctypes

2022-05-10 07:24:19

2022-04-19 08:29:12

Python机器学习

2022-05-16 10:36:08

GitHub开源项目

2022-05-16 09:34:17

Python可视化图表

2022-04-11 13:37:54

编程语言PythonMATLAB

2022-04-12 08:43:21

Python内置模块

2022-05-09 11:19:12

CSS函数开源

2022-04-24 10:12:25

Python软件包代码

同话题下的热门内容

简单的六种防止数据重复提交的方法!用Python进行人脸识别「包括源代码」超实用!教你用 Python 获取并下载美股数据在 Go 中实现一个支持并发的 TCP 服务端Python或R:哪种编程语言更适合数据科学?用 XML 和 Java 构建树莓派打印机的用户界面C语言:如何给全局变量起一个别名?什么!Sentinel流控规则可以这样玩?

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号