Python的内存管理机制

简介: Python 默认内存处理机制为GC(垃圾回收) 内存泄漏 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后, 由于设计错误, 失去了对该段内存的控制, 因而造成了内存的浪费, 导致程序运行速度减慢甚至系统崩溃等严重后果。

Python 默认内存处理机制为GC(垃圾回收)

内存泄漏

指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

  • 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后, 由于设计错误, 失去了对该段内存的控制, 因而造成了内存的浪费, 导致程序运行速度减慢甚至系统崩溃等严重后果。有 __del__() 函数的对象间的循环引用是导致内存泄漏的主凶。
  • 不使用一个对象时使用: del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题。
    通过 Python 扩展模块 gc 来查看不能回收的对象的详细信息, 也可以通过 sys.getrefcount(obj) 来获取对象的引用计数, 并根据返回值是否为 0 来判断是否内存泄漏。

内存管理机制

一. 引用计数
通过引用计数来保持对内存中的变量跟踪Python内部记录中所有在使用对象各有多少个引用。
Python中有个内部跟踪变量叫做引用计数器, 每个变量有多少个引用, 简称引用计数。当对象被创建时就创建了一个引用计数。当某个对象的引用计数为0时, 对象就不在需要, 就列入了垃圾回收队列。
二. 垃圾回收

  • 引用计数:每个对象中都有ob-refcnt来做引用计数。当一个对象被引用, ob-refcnt就会增加, 当引用的对象删除, 那么ob-refcnt就会减少, 当ob-refcnt为零, 就会释放该对象的内存空间。
  • 标记清除:解决循环引用的问题。先按需分配, 等到没有空闲内存的时候, 从寄存器和程序栈上的引用出发, 遍历所有对象和引用把所有能访问的打标记, 最后将没有标记的对象释放掉。
  • 分代技术:提高效率, 提高垃圾回收的效率, 按照存活时间, 分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个“代”, 垃圾回收的频率随代的存活时间增大而减小。Python默认定义分代对象集合, 引用数越大, 对象的存活时间越长。

三. 内存池机制

  • 在Python中, 大多数申请的都是小块的内存, 会执行大量的malloc和free操作。Python引入了一个内存池机制, 用于管理对小块内存的申请和释放, 即Pymalloc机制。它将不用的内存放到内存池而不是返回给操作系统。
  • 当申请的内存小于256字节时, PyObject_Malloc会在内存池中申请内存; 当申请的内存大于256字节时, PyObject_Malloc的行为将蜕化为malloc的行为。当然, 通过修改Python源代码, 我们可以改变这个默认值, 从而改变Python的默认内存管理行为。
  • 对于Python对象, 如整数, 浮点数和List, 都有其独立的私有内存池, 对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数, 用于缓存这些整数的内存就不能再分配给浮点数。

参考链接:时光不写博客-Python的内存管理机制

相关文章
|
3天前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
23 10
|
15天前
|
存储 程序员 Python
Python类的定义_类和对象的关系_对象的内存模型
通过类的定义来创建对象,我们可以应用面向对象编程(OOP)的原则,例如封装、继承和多态,这些原则帮助程序员构建可复用的代码和模块化的系统。Python语言支持这样的OOP特性,使其成为强大而灵活的编程语言,适用于各种软件开发项目。
15 1
|
17天前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
12 2
|
16天前
|
Java Python
Python 中的内存管理
【8月更文挑战第29天】
25 1
|
23天前
|
JavaScript 前端开发 算法
js 内存回收机制
【8月更文挑战第23天】js 内存回收机制
30 3
|
23天前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
20 3
|
30天前
|
存储 缓存 编译器
Linux源码阅读笔记06-RCU机制和内存优化屏障
Linux源码阅读笔记06-RCU机制和内存优化屏障
|
5天前
|
消息中间件 安全 数据库
动手实操!Python IPC机制,打造高效协同的进程军团
【9月更文挑战第10天】在软件开发领域,进程间的高效协作对应用性能与稳定性至关重要。Python提供了多种进程间通信(IPC)机制,如管道、消息队列、套接字、共享内存等,帮助开发者构建高效协同的系统。本文将通过动手实践,使用`multiprocessing`模块演示如何利用队列实现进程间通信。示例代码展示了如何创建一个工作进程从队列接收并处理数据,从而实现安全高效的进程交互。通过实际操作,读者可以深入了解Python IPC的强大功能,提升系统的并发处理能力。
15 0
|
1月前
|
开发者 Python
Python中的异常处理机制及其实践
【8月更文挑战第12天】Python的异常处理机制通过`try`和`except`结构显著提高了程序的稳定性和可靠性。在`try`块中执行可能引发异常的代码,如果发生异常,控制权将转移到与该异常类型匹配的`except`块。此外,还可以通过`else`处理无异常的情况,以及使用`finally`确保某些代码无论如何都会被执行,非常适合进行清理工作。这种机制允许开发者精确地捕捉和管理异常,从而提升程序的健壮性和可维护性。同时,Python还支持定义自定义异常,进一步增强了错误处理的灵活性。
39 4
|
1月前
|
监控 测试技术 数据库
Python自动化测试之异常处理机制
总体而言,妥善设计的异常处理策略让自动化测试更加稳定和可靠,同时也使得测试结果更加清晰、易于理解和维护。在设计自动化测试脚本时,务必考虑到异常处理机制的实现,以保证测试过程中遇到意外情况时的鲁棒性和信息的有效传达。
36 2