垃圾回收器使用了多少时间?

9 投票
1 回答
6586 浏览
提问于 2025-04-16 18:16

我有一个Python程序,它的表现很奇怪:运行时间越长,速度反而越慢。一开始,它每分钟能处理几十个工作单元。但过了一个小时后,每个工作单元却要花上几十分钟。我怀疑这可能是因为垃圾回收器出现了拥堵。

问题是,我的脚本占用的内存太多,导致cProfile在长时间运行时无法正常工作。(参见:cProfile占用大量内存

我们自己写了一个性能监控插件,可以观察到系统的大部分部分,但似乎没有哪个是问题所在。唯一还没有检查的就是垃圾回收器。

有没有其他方法(除了使用profile或cProfile)来查看垃圾回收器花了多少时间?

1 个回答

9

在Python中,大部分垃圾(不再使用的内存)是通过引用计数来处理的。你可能会觉得这个过程应该很快且没有痛苦,但这似乎不是你想要了解的内容。我猜你是在问关于gc模块的垃圾收集器,这个模块主要是用来处理循环引用的情况。

这里有一些可能对你有帮助的信息:http://docs.python.org/library/gc.html

虽然没有直接的方法来计时垃圾收集器的工作,但你可以开启和关闭它,启用调试功能,查看收集的次数等等。这些都可能对你有帮助。

例如,在我的系统上,如果你开启调试标志,gc会打印出经过的时间:

In [1]: import gc

In [2]: gc.set_debug(gc.DEBUG_STATS)

In [3]: gc.collect()
gc: collecting generation 2...
gc: objects in each generation: 159 2655 7538
gc: done, 10 unreachable, 0 uncollectable, 0.0020s elapsed.

除了这些,我首先会关注你程序在运行时的内存使用情况变化。一个可能的原因是它可能达到了可用物理内存的上限,导致因为过多的页面错误而变得缓慢,而不是因为垃圾收集器的问题。

撰写回答