【问题标题】:what are count0, count1 and count2 values returned by the Python gc.get_count()Python gc.get_count() 返回的 count0、count1 和 count2 值是什么
【发布时间】:2019-12-19 01:59:57
【问题描述】:

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 是什么?

【问题讨论】:

    标签: python garbage-collection python-internals


    【解决方案1】:

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

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

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

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

    这能回答问题吗?

    信用: gc.get_count() 方法的信息来自 stactify.com/python-garbage-collection/

    【讨论】:

      【解决方案2】:

      很遗憾,@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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 2011-09-21
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        相关资源
        最近更新 更多