内存未释放,即使对象引用计数为 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
基于引用计数的思想,x
在myfunc
的本地范围内定义时,其引用计数会增加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
在您的代码中没有任何用处。它所做的只是释放对绑定到 x
的 list
的当前引用。由于 x
是一个纯局部变量,您没有 return,因此该引用将在您 return
的那一刻被释放。 del
的裸名很少有用(除了极少数情况下,涉及全局范围内的临时对象,你想在它们用于其他一些全局初始化后摆脱它们),因为 del
ed 名称无论如何通常都会在短时间内消失。
在下面的代码片段中,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
基于引用计数的思想,x
在myfunc
的本地范围内定义时,其引用计数会增加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
在您的代码中没有任何用处。它所做的只是释放对绑定到 x
的 list
的当前引用。由于 x
是一个纯局部变量,您没有 return,因此该引用将在您 return
的那一刻被释放。 del
的裸名很少有用(除了极少数情况下,涉及全局范围内的临时对象,你想在它们用于其他一些全局初始化后摆脱它们),因为 del
ed 名称无论如何通常都会在短时间内消失。