python - python 内置垃圾收集 - 总和

标签 python garbage-collection

当我尝试在 python 解释器中运行以下代码时,它给了我一个明显的 MemoryError,因为我正在运行一个无限循环以检查内存使用情况。

def a():
 i=2
 while True:
  yield i
  i*=i

print sum(a())

当我运行这段代码时,我可以看到 python 的内存使用量在增长。但是,当我收到 MemoryError 时,我可以看到 python 解释器进程仍然持有大约 200 MB 的内存,即使 sum 函数不再在解释器中运行。 我的问题是:即使在垃圾收集方面,python 的内置函数也不应该非常有效吗?内置函数不应该清理自己的困惑,而不是将垃圾收集的责任交给用户吗?

最佳答案

如果 python 内置函数有内存泄漏,那是一个错误。

但是,仅仅因为 python 仍在占用内存并不意味着存在内存泄漏。 Python 有各种有趣的分配技巧,因此它可能会保留您的内存以备将来使用。因此,您不能简单地查看任务管理器以查看 python 是否正确处理了内存。

要检查实际的内存泄漏,一种技术是重复运行您的代码。如果它是真正的内存泄漏,则每次运行它时都应该丢失内存。如果是幻象内存泄漏,内存实际上会被第二次重用,你不会丢失任何内存。

我在我的 Linux 机器上运行了你的代码,虽然我确实发现它在运行该循环一段时间后比之前使用了更多的内存,但再次运行它并没有使用额外的内存,实际上是一些内存初跑的“迷失”似乎找回了。

关于python - python 内置垃圾收集 - 总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202827/

相关文章:

java - 在 Java 中调整垃圾收集参数

java - 软引用与弱引用

python - 扫描一个子网范围,Python 2.7 端口扫描器

python - 更改桌面背景和播放 .mp3 文件不起作用

python - Keras - .flow_from_directory(目录)

python - 在程序运行期间查看生成列表

python - 为什么分类器的score函数返回的结果与sklearn中的cross_val_score函数完全不同?

python - 通过youtube python API添加播放列表条目

java - 关于垃圾回收。为什么我们需要调用 System.gc();?

c# - Garbage Collection和各代阈值