如何识别Python对象在3代(GC)中的哪一代?

时间:2014-05-05 23:15:23

标签: python c memory-management garbage-collection ctypes

Python的垃圾收集基于引用计数,但为了识别引用周期,使用了世代garbage collection

我们正在尝试各种方法根据几个信号动态调整阈值,其中一个信号是最年轻集合中的对象(在某些时间间隔采样)与最旧集合中的对象的相似性。

我已经使用了gc模块(也就是垃圾收集器界面),但是无法找到允许我检索有关对象所在代的信息的原因。

任何提示/文档/资源都表示赞赏。

谢谢!

更新 我的第一次尝试是使用ctypes module,它允许从DLL和共享库(.so)调用函数。但是,当使用ctypes.util的find_library时,只找到了标准的C库(libgc,libc等),这些库确实允许访问printf,strlen等函数。

使用--enable-shared标志访问gcmodule我重建的CPython中的函数/数据结构,并使用生成的共享库函数(与{{3}一起列出) })。

另一种可能性是使用ctypes的pythonapi和pyobject,但nm few tutorials在线使用。

欢迎任何有关pythonapi,pyobject如何与gcmodule.c一起使用的提示!

UPDATE2 在gcmodule.c中,我已经确定了以下函数 - 已经可以通过exist获得,这与我尝试完成的任务非常相似(对于给定的(容器)对象(或内存地址) )返回它跟踪的世代数:

static PyObject *
gc_get_objects(PyObject *self, PyObject *noargs)
{
    int i;
    PyObject* result;

    result = PyList_New(0);
    if (result == NULL)
        return NULL;
    for (i = 0; i < NUM_GENERATIONS; i++) {
        if (append_objects(result, GEN_HEAD(i))) {
            Py_DECREF(result);
            return NULL;
        }
    }
    return result;
}

我的类似于上面的函数的包装器将整数作为参数(从而替换上面循环中的i)并仍使用append_objects

0 个答案:

没有答案