删除/重置列表或双端队列? 内存泄漏问题其他方法

问题描述

我正面临内存泄漏,它发生在线程中。我的代码结构如下:

while True:
    with self._lock:
        if self.valid_data: 
            # do something

内存泄漏

如何完全删除列表。

我的解决方
self.__data.clear()
self.__data = []

问题

如何在python中为列表和双端队列数据结构非常有效地清除内存? 在这里,3个使用者线程使用该数据,并且一个重置线程根据某个标志清除该线程。 del self.__data还是其他方式?

这种情况很少发生,这使我难以重现,所以我只是认为最好的代码可以解决问题。请告知。

其他方法

解决方法

清除,重新分配和删除几乎是相同的。他们将花费大部分时间删除引用,并希望删除其包含的对象。

也就是说,假设没有其他引用这些对象。如果还有另一个对列表或双端队列的引用,则除删除引用计数之一外,赋值和删除均不执行任何操作。在这种情况下,您必须执行del mylist[:]mydeque.clear()。如果所包含的对象在其他地方被引用,它们也不会真正被删除。

尽管通常会立即删除对象,但是如果它们具有循环引用(a.b = bb.a = a),则垃圾收集器需要运行以收集它们。它在后台是自动的,但是在进行大型删除以清除内存后立即调用gc.collect()是合理的。然后,您还可以检查len(gc.garbage),其中包含永远不会被收集的死对象。大于0的数字有点不好,但在数字变大之前基本上是无害的。然后,您必须弄清楚代码为何创建死对象(硬)。

但是转储列表正确吗?这对程序输出的有效性意味着什么?当您发现问题时,最好引发异常并运行。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...