Day 053 — 内存管理与垃圾回收练习清单
✅ 今日学习清单
- [ ] 理解 Python 的引用计数机制
- [ ] 掌握标记-清除算法原理
- [ ] 理解分代回收机制
- [ ] 熟练使用
gc模块 - [ ] 学会排查内存泄漏
- [ ] 了解内存优化技巧
- [ ] 完成代码示例的运行和理解
📝 基础练习
练习 1:引用计数观察
创建一个类,使用 sys.getrefcount() 观察以下场景的引用计数变化:
1. 对象赋值给多个变量
2. 对象放入列表、字典
3. 删除变量后引用计数变化
练习 2:垃圾回收触发
使用 gc 模块观察以下情况:
1. 创建循环引用对象后,gc.collect() 的返回值
2. 查看 gc.get_count() 在创建大量对象前后的变化
3. 查看 gc.get_stats() 的统计信息
练习 3:循环引用检测
创建一个包含循环引用的类,使用 gc.get_referrers() 追踪引用链。
🔥 进阶挑战
挑战 1:内存泄漏检测
编写一个函数,检测给定对象是否存在循环引用:
1. 使用 gc.get_referrers() 递归追踪引用
2. 检测是否存在循环引用
3. 返回循环引用路径
挑战 2:内存优化
比较以下实现的内存使用差异:
1. 普通类 vs __slots__ 类
2. 列表推导式 vs 生成器表达式
3. 字符串拼接 vs join()
挑战 3:内存监控器
实现一个简单的内存监控器: 1. 定期检查内存使用情况 2. 超过阈值时发出警告 3. 自动触发垃圾回收 4. 记录内存使用历史
🧠 思考题
-
为什么 Python 使用引用计数而不是只用垃圾回收器? 提示:考虑实时性和性能。
-
分代回收的三代有什么区别? 提示:考虑对象的存活时间。
-
为什么有
__del__方法的循环引用对象无法被回收? 提示:考虑__del__的调用时机。 -
如何检测 Python 程序的内存泄漏? 提示:考虑
gc模块和第三方工具。 -
gc.garbage列表中存放的是什么? 提示:考虑无法回收的对象。