python';s gc-从get_计数获取对象

python';s gc-从get_计数获取对象,python,garbage-collection,Python,Garbage Collection,我试图理解从gc.get\u count和gc.get\u objects()返回的值之间的差异 首先,文件()说: gc.get_count() 将当前集合计数作为(count0,count1, 计数2) gc.get_对象(生成=无) 返回收集器跟踪的所有对象的列表,不包括返回的列表。如果“生成”不是“无”,则仅返回收集器在该生成中跟踪的对象 现在,我运行一个简单的REPL: > import gc > gc.get_count() (692, 1, 1) > len(gc

我试图理解从
gc.get\u count
gc.get\u objects()
返回的值之间的差异

首先,文件()说:

gc.get_count()

将当前集合计数作为(count0,count1, 计数2)

gc.get_对象(生成=无)

返回收集器跟踪的所有对象的列表,不包括返回的列表。如果“生成”不是“无”,则仅返回收集器在该生成中跟踪的对象

现在,我运行一个简单的REPL:

> import gc
> gc.get_count()
(692, 1, 1)
> len(gc.get_objects())
6372
> len(gc.get_objects(0))
771
> len(gc.get_objects(1))
490
> len(gc.get_objects(2))
5111
> gc.get_count()
(693, 1, 1)
因此,从
get_count
可以看出,三代人加起来大约有700个对象。 但是
get_对象
return>6k对象。 我试图查看
DEBUG\u SAVEALL
,但它似乎与任何数字都没有关联(不在
get\u count
中,也不在
get\u objects
中)

我的问题是:

  • 为什么会有差异?
    get\u objects
    中的对象与
    get\u count
    中跟踪的对象之间的实际区别是什么?关于stackoverflow有以下两个问题:但它们似乎没有回答差异
  • 如何实际获取
    get\u count
    中引用的对象(针对特定的一代)

  • 谢谢

    所以我读了一些关于CPython实现()的内容,这是我学到的:

    1) 基本上,
    get\u count
    (impl-here:)度量在一个较低级别的生成中发生的收集量,直到该生成本身被收集为止(请参见此处:)

    例如,当收集第0代(第一代)时,第1代的计数增加1。 gen 0的计数在分配时增加,在释放时减少(当
    \allocations-\deallocations>threashold
    时收集开始)

    这回答了问题(1)——差异是因为它们是完全不同的东西


    2) 既然问题1得到了回答,那么问题2在被问到时实际上并不相关

    但是,我们可能会问另一个问题,即“如何跟踪为特定生成收集的对象?”

    在Python3.8中,这是可能的,因为
    get_objects
    的接口已经更改,并且可以获取“属于”特定代的对象。 考虑到这一点,可以注册一个回调(通过
    gc.callbacks.append(callback\u方法)
    ),该回调将通过在清理对象之前获取对象来跟踪特定gen的集合(但请注意,您不希望实际强引用这些对象,否则只需测量即可改变行为),然后获取它们,并比较结果



    我将在一段时间内不接受此答案,以便有机会获得其他答案,因为我正在回答我自己的问题。

    因此,我已经阅读了一些关于CPython实现()的内容,以下是我学到的:

    1) 基本上,
    get\u count
    (impl-here:)度量在一个较低级别的生成中发生的收集量,直到该生成本身被收集为止(请参见此处:)

    例如,当收集第0代(第一代)时,第1代的计数增加1。 gen 0的计数在分配时增加,在释放时减少(当
    \allocations-\deallocations>threashold
    时收集开始)

    这回答了问题(1)——差异是因为它们是完全不同的东西


    2) 既然问题1得到了回答,那么问题2在被问到时实际上并不相关

    但是,我们可能会问另一个问题,即“如何跟踪为特定生成收集的对象?”

    在Python3.8中,这是可能的,因为
    get_objects
    的接口已经更改,并且可以获取“属于”特定代的对象。 考虑到这一点,可以注册一个回调(通过
    gc.callbacks.append(callback\u方法)
    ),该回调将通过在清理对象之前获取对象来跟踪特定gen的集合(但请注意,您不希望实际强引用这些对象,否则只需测量即可改变行为),然后获取它们,并比较结果



    我将在一段时间内不接受这个答案,以便有机会获得其他答案,因为我正在回答我自己的问题。

    我猜
    get\u count()
    返回上一个周期收集的对象数,
    get\u objects()
    是仍然存在的对象。@barmar-它不同,不是收集的对象数量,而是收集的数量(比这更精细,请参见下面的答案)。我猜
    get\u count()
    返回上一个周期收集的对象数量,
    get\u objects()
    是仍然活动的对象。@barmar-它是不同的,不是收集对象的数量,而是收集的数量(比这更精确,请参见下面我的答案)。