← 返回 Day 53 正文

Day 53 · 练习与清单

Day 053 — 内存管理与垃圾回收练习清单

✅ 今日学习清单


📝 基础练习

练习 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. 记录内存使用历史


🧠 思考题

  1. 为什么 Python 使用引用计数而不是只用垃圾回收器? 提示:考虑实时性和性能。

  2. 分代回收的三代有什么区别? 提示:考虑对象的存活时间。

  3. 为什么有 __del__ 方法的循环引用对象无法被回收? 提示:考虑 __del__ 的调用时机。

  4. 如何检测 Python 程序的内存泄漏? 提示:考虑 gc 模块和第三方工具。

  5. gc.garbage 列表中存放的是什么? 提示:考虑无法回收的对象。


📚 参考资料