内存未释放,即使对象引用计数为 0

Memory not released, even as object ref count 0

在下面的代码片段中,x 不再被定义,但是它占用的内存还没有被释放。为什么?

import psutil
import os
def memtest():
    process = psutil.Process(os.getpid())
    x = (process.memory_info().rss)/10**6
    return float(x)

def myfunc():
    x = [2]*10**7
    return 0

print(memtest())
myfunc()
print(memtest())

输出:

9.519104
89.546752

基于引用计数的思想,xmyfunc的本地范围内定义时,其引用计数会增加1,一旦我们离开该范围,它其引用计数减 1,因此与该对象关联的内存应该已被释放。为什么不是这样?

编辑:

即使在 运行 del x 之后,内存也没有被释放。为什么?

import psutil
import os
def memtest():
    process = psutil.Process(os.getpid())
    x = (process.memory_info().rss)/10**6
    return float(x)

def myfunc():
    x = [2]*10**7
    del x
    return 0

print(memtest())
myfunc()
print(memtest())

输出

9.629696
89.657344

分配器并不总是将内存释放回OS;他们会坚持使用它来满足未来的分配,而无需从 OS 重新请求内存(比对现有分配进行分区要昂贵得多)。尝试连续多次调用您的函数;如果内存使用一直增加,好吧,也许有问题,但在大多数情况下,以后使用的大部分内存来自你之前释放的。

明确地说,del 在您的代码中没有任何用处。它所做的只是释放对绑定到 xlist 的当前引用。由于 x 是一个纯局部变量,您没有 return,因此该引用将在您 return 的那一刻被释放。 del 的裸名很少有用(除了极少数情况下,涉及全局范围内的临时对象,你想在它们用于其他一些全局初始化后摆脱它们),因为 deled 名称无论如何通常都会在短时间内消失。