pci*_*icz 5 python garbage-collection
在某些迭代任务期间覆盖变量时,变量到底什么时候被垃圾收集?例如,假设我们有一个内存密集型函数,some_function(). 该函数还返回一个大对象data。
def some_function(x):
...
return data
Run Code Online (Sandbox Code Playgroud)
如果在某些迭代任务期间调用此函数,例如
for x in some_iterable:
output = some_function(x)
Run Code Online (Sandbox Code Playgroud)
新变量output一旦被some_function()调用就会被垃圾收集吗?或者它只在返回新值时释放内存?我只关心内核中释放的内存,而不一定是系统中释放的内存(所以我可能错误地使用了术语“垃圾收集”)。
当数据不再可访问时,Python 垃圾收集器会在后台将内存标记为可用于后续分配。然而,它并没有相对于内核被释放。
如果您关心的是内核何时将物理内存提供给其他进程,那就是另一回事了:内存仍然虚拟地映射到 Python 进程的地址空间,因此为了让物理内存被内核释放内核,要么你的Python进程必须退出(从而释放分配给它的所有物理内存),要么根据内核的虚拟内存策略,以前保存数据的物理内存需要变成最近最少使用的。如果没有其他进程与之竞争(可能在多千兆字节的系统中),则可能需要很长时间。如果有其他进程竞争物理内存,则可能会在几秒钟或几分钟内发生。此外,如果您的 Python 进程分配更多数据,这些页面最近会突然再次使用,因此成为物理回收的最后一个。但是,如果您的物理内存如此低,则您的系统可能存在其他问题。
| 归档时间: |
|
| 查看次数: |
1457 次 |
| 最近记录: |