首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`gc.garbage`为空时python代码中的垃圾收集段错误

`gc.garbage`为空时python代码中的垃圾收集段错误
EN

Stack Overflow用户
提问于 2015-10-24 03:36:25
回答 1查看 1.3K关注 0票数 0

以下代码运行良好,并打印出一个空列表(在python3.4上):

代码语言:javascript
复制
import gc
# code interfacing with C and cython
print(gc.garbage, flush=True)

将这一行追加到最后面使其为分段错误:

代码语言:javascript
复制
gc.collect()

这似乎是纯粹的运气,自动收集不发生在它自己(它花了我一些时间来获得可复制的错误)。集合也不会运行在“程序的末尾”,因为我正在交互地运行这个集合。

一些googling让我相信一些C/Cython代码正在创建/销毁对象,而没有告诉python那些对象已经从内存中删除了。然后python尝试删除它们并崩溃。

我怎么才能找到那些东西呢?我以为他们会在坠机前在gc.garbage引发gc.collect()

还是我的假设完全不正确?

gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_LEAK)放在此代码的前面,将导致python异常,而不是分段错误。

代码语言:javascript
复制
---> print(gc.garbage, flush=True)
     gc.collect()
...
ReferenceError: weakly-referenced object no longer exists

编辑:在其中一个答案的注释后更改/简化

EN

回答 1

Stack Overflow用户

发布于 2015-10-24 03:55:14

你可能误解了gc.garbagegc.disable()gc.disable()关闭循环垃圾收集器,只保留引用计数内存管理活动。即使垃圾收集器被关闭,也没有单独的“垃圾检测器”一直在检测循环垃圾;垃圾检测是垃圾收集器的工作。

而且,gc.garbage中只填充了GC无法清除的特定类型的奇怪垃圾。大多数垃圾永远不会在那里结束。

至于您将如何进行调试,我不熟悉您将使用的工具。像瓦兰这样的通用工具可能会很有用,而像gc.DEBUG_LEAK这样的GC标志可能会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33314279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档