Python gc.get_count() 返回的 count0、count1 和 count2 值是什么

what are count0, count1 and count2 values returned by the Python gc.get_count()

python 的 gc 包的文档是这样说的 gc.get_count():

gc.get_count()
    Return the current collection counts as a tuple of (count0, count1, count2).

这是一个示例程序:

import gc


if __name__=="__main__":
    print("making some data")
    for k in range(10):
        root = [range(i,1000) for i in range(1,1000)]
    print("len(gc.get_objects):",len(gc.get_objects()))
    print("gc.get_stats:",gc.get_stats())
    print("gc.get_count:",gc.get_count())

这是输出:

making some data
len(gc.get_objects): 7130
gc.get_stats: [{'collections': 16, 'collected': 99, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}, {'collections': 0, 'collected': 0, 'uncollectable': 0}]
gc.get_count: (75, 5, 1)

显然,count0 = 75,count1=5,count2=1。

count0、count1 和 count2 是什么?

gc包中的

'gc'指的是'garbage collection'。它是一组实践方法,您可以通过这些方法接管系统的垃圾收集职责。这样做可以释放资源并简化程序执行的效率。但应该指出的是,系统垃圾收集管理已经相当不错了。是的,系统为您创建和引用的每个变量创建了一堆对象和其他开销,是的,开销可能会持续很长时间(即使您调用 del 命令),但总的来说它没有害处。

gc.get_count() returns 一个元组,指示系统保留的对象引用的内部管理计数。这些是系统将知道何时可以(自动)收集垃圾的计数。

元组的三个值中的每一个代表三代中的对象(引用)。 Python 一共保存了三代的列表。每次一个对象在垃圾收集事件中幸存下来,它就会向上移动到下一代。 (75, 5, 1) 表示最新一代有75个对象,中间一代有5个对象,最老一代有1个对象。

这些计数是内部系统值,而不是您分配的值或(很多)直接控制的值。您可以使用 gc.collect() 重置一些值,释放大量资源;并且您可以使用 gc.get_threshold() 和 gc.set_threshold() 设置系统用于触发垃圾收集事件的触发器值。但是除了最核心的编码人员和开发人员(我当然不是其中之一)之外的所有人,垃圾收集最好留给 python 系统处理。

这是否回答了问题?

信用: gc.get_count() 方法的信息是从 stactify 收集的。com/python-garbage-collection/

很遗憾,@user10637953 给出的答案和引用的文章都不正确。

count0 是自上次垃圾回收以来发生的(跟踪对象分配 - 释放)。

有时达到 gen0 阈值(默认为 700)后,会发生 gen0 垃圾回收,count0 将重置。

count1 是自上次 gen1 收集以来的 gen0 收集数。达到阈值(默认为 10)后,将进行 gen1 收集,并且 count1 将重置。

count2 是自上次 gen2 收集以来的 gen1 收集数。达到阈值(也默认为 10)后,将进行 gen2 收集,并且 count2 将重置。

您可以通过 运行 gc.collect(gen) 自己轻松证明这一点,并使用 gc.get_threshold() 查看阈值。

有关详细信息,请参阅 official dev guide