考虑这两个代码,我在python控制台中运行:
l=[]
for i in range(0,1000): l.append("."*1000000)
# if you check your taskmanager now, python is using nearly 900MB
del l
# now python3 immediately free-d the memory
现在考虑一下:
l=[]
for i in range(0,1000): l.append("."*1000000)
l.append(l)
# if you check your taskmanager now, python is using nearly 900MB
del l
# now python3 won't free the memory
由于我正在使用这些对象,并且我需要从内存中释放它们,我需要知道为了让python识别它需要删除相应的内存。
PS:我使用的是Windows7。
答案 0 :(得分:1)
因为您已经创建了循环引用,所以在垃圾收集器运行,检测循环并清理它之前,内存不会被释放。 You can trigger that manually:
import gc
gc.collect() # Memory usage will drop once you run this.
收藏家会偶尔自动投放,但仅限于certain conditions related to the number of object allocations/deallocations are met:
gc.set_threshold(threshold0 [,threshold1 [,threshold2]])
设置垃圾收集阈值(收集频率)。 将threshold0设置为零会禁用收集。
GC根据数量将对象分为三代 收集清扫他们幸存了下来。新对象放在 最年轻的一代(第0代)。如果对象在集合中存活 它被移动到下一代老一代。因为第2代是 最古老的一代,那一代的物体留在那里 采集。 为了决定何时运行,收集器会跟踪 自上次以来的数量对象分配和解除分配 采集。当分配数量减去数量时 deallocations超过threshold0,收集开始。
因此,如果您继续在解释器中创建更多对象,最终垃圾收集器将自行启动。您可以通过降低threshold0
来更频繁地实现这一目标,或者当您知道已删除其中一个包含参考周期的对象时,您可以手动调用gc.collect
。