究竟什么时候覆盖的变量会被垃圾回收?
When exactly do overwritten variables get garbage collected?
在某些迭代任务中覆盖变量时,变量究竟何时被垃圾回收?例如,假设我们有一个内存密集型函数 some_function()
。这个函数也是returns一个大对象,data
.
def some_function(x):
...
return data
如果在某些迭代任务期间调用此函数,例如
for x in some_iterable:
output = some_function(x)
新变量 output
是否会在调用 some_function()
后立即被垃圾回收?还是仅在返回新值时才释放内存?我只关心内核中释放的内存,不一定在系统中(所以我可能错误地使用了垃圾收集一词)。
当数据不再可用时,Python 垃圾收集器会在后台将内存标记为可用于后续分配。但是,它不会相对于内核被释放。
如果您关心的是内核何时将物理内存提供给其他进程使用,那是另一回事:内存仍然虚拟映射到您的 Python 进程的地址 space ,因此为了让内核释放该物理内存,您的 Python 进程必须退出(从而释放分配给它的所有物理内存),或者以前保存数据的物理内存需要变为最近最少使用 根据内核的虚拟内存策略。如果没有其他进程竞争它(可能在数 GB 的系统中),那可能需要很长时间。如果有其他进程竞争物理内存,则可能会在几秒或几分钟内发生。此外,如果您的 Python 进程分配了更多数据,突然间这些页面最近再次被使用,因此成为物理回收的最后一行。但是,如果您的物理内存不足,则您的系统可能存在其他问题。
在某些迭代任务中覆盖变量时,变量究竟何时被垃圾回收?例如,假设我们有一个内存密集型函数 some_function()
。这个函数也是returns一个大对象,data
.
def some_function(x):
...
return data
如果在某些迭代任务期间调用此函数,例如
for x in some_iterable:
output = some_function(x)
新变量 output
是否会在调用 some_function()
后立即被垃圾回收?还是仅在返回新值时才释放内存?我只关心内核中释放的内存,不一定在系统中(所以我可能错误地使用了垃圾收集一词)。
当数据不再可用时,Python 垃圾收集器会在后台将内存标记为可用于后续分配。但是,它不会相对于内核被释放。
如果您关心的是内核何时将物理内存提供给其他进程使用,那是另一回事:内存仍然虚拟映射到您的 Python 进程的地址 space ,因此为了让内核释放该物理内存,您的 Python 进程必须退出(从而释放分配给它的所有物理内存),或者以前保存数据的物理内存需要变为最近最少使用 根据内核的虚拟内存策略。如果没有其他进程竞争它(可能在数 GB 的系统中),那可能需要很长时间。如果有其他进程竞争物理内存,则可能会在几秒或几分钟内发生。此外,如果您的 Python 进程分配了更多数据,突然间这些页面最近再次被使用,因此成为物理回收的最后一行。但是,如果您的物理内存不足,则您的系统可能存在其他问题。