直接回答:CPython 的内存管理以引用计数为主:每个对象头里存计数,a = obj 加一、离开作用域减一,归零立即释放——这给了 Python 确定的析构时机。引用计数的盲区是循环引用(A 引 B、B 引 A,外部都断开后计数仍非零),于是有分代循环检测作为补充:gc 模块定期扫描容器对象(列表、字典、实例),从计数中扣除集合内部相互引用,找出不可达子图回收。三代分代假设"年轻对象早死",减少扫描频率。

展开解析:实践影响:__del__ 析构在循环引用中历史上不可预测(3.4 起可处理但仍建议避免依赖);gc.collect() 手动触发只在内存敏感场景使用,别当常规手段;weakref 是打破循环的标准工具(缓存、观察者列表、树结构的父指针)。性能认知:引用计数让每次赋值都有原子外的计数开销,这正是 free-threading(3.13 实验性去 GIL)和 immortal objects(PEP 683)要优化的点。排查内存增长:sys.getsizeoftracemalloc 按分配点统计、objgraph 画引用图找泄漏簇。注意 CPython 实现细节:小整数、短字符串驻留会让"对象没被释放"的直觉判断失灵;PyPy 等实现没有引用计数,别写依赖立即析构的代码。

追问方向:分代回收的晋升规则?weakref 回调的时机?free-threading 下引用计数怎么改(偏向引用计数)?

(约 460 字)