管理垃圾收集
有两种方法可以影响执行内存清理的时间。它们影响自动过程的执行频率,另一个是手动触发清理。
可以通过调整影响收集器运行频率的收集阈值来操作垃圾收集器。Python 使用基于代的内存管理系统。新对象保存在最新一代 - generation0 中,每个幸存的集合中,对象都被提升为老一代。到达上一代 - 第二代后,他们不再升职。
可以使用以下代码段更改阈值:
import gc
gc.set_threshold(1000, 100, 10) # Values are just for demonstration purpose
第一个参数表示收集 generation0 的阈值。每次分配数量超过解除分配数量 1000 时,将调用垃圾收集器。
每次运行都不会清除老一代以优化过程。第二个和第三个参数是可选的,可以控制清除旧代的频率。如果 generation0 进行处理 100 次不清洗 generation1 ,然后 generation1 将被处理。类似地,在对象第二代将仅当在的那些处理 generation1 进行清洗 10 次而不接触第二代。
手动设置阈值有益的一个实例是当程序分配大量小对象而不解除分配时导致垃圾收集器过于频繁地运行(每个 generation0_threshold 对象分配)。即使收集器非常快,当它运行在大量对象上时,它会带来性能问题。无论如何,选择阈值并没有一个尺寸适合所有策略,它的用例是可靠的。
手动触发集合可以在以下代码段中完成:
import gc
gc.collect()
根据分配和解除分配的数量自动触发垃圾收集,而不是根据消耗或可用内存。因此,在处理大对象时,在触发自动清理之前内存可能会耗尽。这是手动调用垃圾收集器的一个很好的用例。
虽然这是可能的,但这并不是一种鼓励的做法。避免内存泄漏是最佳选择。无论如何,在大项目中检测内存泄漏可能是一项任务,并且手动触发垃圾收集可以用作快速解决方案,直到进一步调试。
对于长时间运行的程序,可以按时间或基于事件触发垃圾收集。第一个示例是一个 Web 服务器,它在固定数量的请求之后触发集合。对于后者,在收到某种类型的请求时触发垃圾收集的 Web 服务器。