Python 内存管理机制与内存泄漏防范

Python 内存管理机制与内存泄漏防范

一、Python 内存管理核心机制

1. 引用计数(主机制)

Python 通过引用计数跟踪对象被引用的次数,当引用归零时立即回收内存。

import sys

a = []  # 对象引用计数=1
b = a   # 引用计数+1 → 总计数=2
print(sys.getrefcount(a))  # 显示引用计数(临时+1)
del b    # 引用计数-1
del a    # 引用计数归零 → 内存回收

2. 标记-清除(处理循环引用)

解决容器对象的循环引用问题:

# 循环引用示例
list1 = []; list2 = []
list1.append(list2); list2.append(list1)
  • 标记阶段:从根对象(全局变量、调用栈)出发标记可达对象
  • 清除阶段:回收不可达对象

3. 分代回收(性能优化)

  • 三代对象:0代(新对象)、1代(存活一次GC)、2代(存活多次GC)
  • 回收频率:0代 > 1代 > 2代
  • 阈值触发:当分配数 - 释放数 > 阈值时触发对应代GC

4. 内存池机制

  • 小对象(<=256字节)使用专用内存池,避免频繁malloc/free
  • 大对象直接使用系统malloc

二、常见内存泄漏场景

1. 循环引用 + 析构缺失

class Node:
    def __init__(self):
        self.parent = None
        self.children = []

# 泄漏示例
node1 = Node()
node2 = Node()
node1.children.append(node2)
node2.parent = node1  # 循环引用
del node1, node2      # 引用计数不为零,需依赖GC

解决方案

# 方法1:手动打破循环
node1.children.clear()
node2.parent = None

# 方法2:使用weakref
import weakref
class Node:
    def __init__(self):
        self.parent = weakref.ref(None)  # 弱引用

2. 全局容器累积

cache = {
   }

def process_data(data):
    result = heavy_computation(data

你可能感兴趣的:(python,开发语言)