`

解读Python内存管理机制

阅读更多

参考:http://developer.51cto.com/art/201007/213585.htm



内存管理,对于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对象缓冲池里。

分享到:
评论

相关推荐

    python memory validator

    在这个专题中,我们将深入探讨Python内存管理机制,了解内存验证器的工作原理,并通过教程文件“tutorial”学习如何有效地使用这一工具。 首先,Python的内存管理主要包括垃圾回收(Garbage Collection, GC)机制,...

    Python-psmem一个用于精确报告Linux核心内存用量的简单Python脚本

    **Python-psmem 简介** `ps_mem` 是一个基于 Python 编写的命令行工具,主要用于在 Linux 操作系统中...通过学习其工作原理,我们可以加深对 Linux 内存管理和 Python 应用开发的理解,提升我们的系统管理和开发技能。

    Python.High.Performance.2nd.Edition.2017

    其次,Python的内存管理也是性能优化的关键。书中的章节可能涵盖了Python的垃圾回收机制、对象生命周期,以及如何通过数据结构选择和内存池技术来优化内存使用。例如,理解列表和元组的区别,以及何时使用生成器可以...

    Python面试常见问题汇总集锦(含爬虫工程师面试考点)

    Python中的全局解释器锁(GIL)是为了简化内存管理而设计的,它限制了同一时刻只有一个线程可以执行Python字节码。这意味着在CPython中,多线程并不会带来性能上的提升。相反,由于I/O操作可以释放GIL,Python通过...

    Python源码剖析

    2. **Python内存管理**:深入讲解Python如何管理内存,包括引用计数、垃圾回收机制,以及如何避免常见的内存问题。 3. **对象模型**:解释Python的对象系统,如类与对象的关系、继承、多态、封装等面向对象编程的...

    Python3官方手册中文版

    ### Python3官方手册中文版知识点概览 #### 一、Python3官方手册中文版...以上是对Python3官方手册中文版中的关键知识点的详细解读,涵盖了Python编程的核心概念和技术要点,适合初学者和有一定基础的开发者阅读学习。

    Python进阶资料.zip

    5. **《Python进阶》**:这可能是一本专门针对Python高级特性和实践的书籍,可能会涉及如并发编程、内存管理、Cython扩展等主题,帮助读者提升编程效率和代码性能。 6. **《利用Python进行数据分析 第二版》**:由...

    Python小工具之消耗系统指定大小内存的方法

    通过上述知识点的介绍,我们可以看到这个Python小工具不仅实用,而且对于加深对内存管理和计算机基础的理解也非常有帮助。无论是初学者还是有经验的开发者,都可以从中获得有价值的启示。希望本文能对你在编程学习和...

    这是Inside-The-Python-Virtual-Machine的中文翻译,此仓库仅为个人学习记录所用.zip

    总的来说,《Inside The Python Virtual Machine》的中文翻译版本可以帮助我们理解Python的内部机制,包括对象模型、内存管理、字节码解析、垃圾回收、动态特性以及性能优化等方面。通过对PVM的深入了解,我们可以...

    《Python进阶》(Intermediate Python - Chinese Version).zip

    理解Python的异常层次结构和错误信息的解读,有助于快速定位和解决问题。 7. **并发与多线程**:Python的`threading`和`multiprocessing`模块提供了多线程和多进程的支持。理解GIL(全局解释器锁)对Python并发的...

    中文版django book Python web开发最佳指引

    ### 十七、解读Django的管理界面 第十七章进一步探讨了Django管理界面的高级定制方法,使开发者可以根据具体需求对其进行个性化设置。 ### 十八、国际化 第十八章介绍了Django如何支持多语言环境。Django内置了...

    Python库 | vmprof-0.4.2.dev1-cp36-cp36m-manylinux1_x86_64.whl

    - 剖析结果的解读需要对Python执行机制有一定理解,包括函数调用、内存管理等。 - vmprof不适用于多线程或多进程环境,因为它的数据是基于单一执行线程的。 总之,`vmprof`是Python开发者进行性能优化的得力助手,...

    Python.Cookbook(第2版)中文版

    7. **模块和包管理**:Python的模块和包机制使得代码组织有序且可重用。书中介绍如何编写模块,使用import语句,以及如何创建和使用包,包括__init__.py文件的作用。 8. **系统交互**:Python可以轻松地与操作系统...

    Python-DBSherlock是一个数据库的性能诊断框架

    使用DBSherlock时,开发者或DBA需要理解数据库的基本原理,如查询优化、锁机制、事务处理等,以便更好地解读分析结果。同时,持续学习和掌握Python编程,以及相关的数据库API,将有助于更深入地利用DBSherlock进行...

    Python库 | rhvhauto_common_utils-0.1.3-py3-none-any.whl

    9. **性能优化**:对于性能敏感的应用,库可能包含一些优化技巧,如缓存机制、内存管理等。 10. **测试工具**:为了确保代码质量,库可能包含一些测试工具,如断言函数、测试框架集成等。 由于没有具体的库文档和...

    Fundamentals Of Python. Data Structures, 2nd ed. -- 2018.pdf

    - **解读**:该书名为《Python基础:数据结构(第二版)》,出版于2018年。它主要关注Python编程语言中的基本概念和数据结构的使用。 #### 描述解析 - **描述**:“Lambert -- Fundamentals Of Python. Data ...

    python-src-analysis:python源码分析

    7. **垃圾回收**: Python的内存管理由垃圾回收器负责,主要在` Objects/gc.c`中。理解这个过程有助于优化内存使用和避免内存泄漏。 8. **异常处理**: Python的异常处理机制在`Python/exceptions.c`中实现,包括异常...

Global site tag (gtag.js) - Google Analytics