Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 被覆盖的变量何时被垃圾回收?_Python_Garbage Collection - Fatal编程技术网

Python 被覆盖的变量何时被垃圾回收?

Python 被覆盖的变量何时被垃圾回收?,python,garbage-collection,Python,Garbage Collection,当在某个迭代任务中覆盖变量时,该变量何时被垃圾回收?例如,假设我们有一个内存密集型函数,some_function()。此函数还返回一个大对象,数据 def一些_函数(x): ... 返回数据 如果在某个迭代任务期间调用此函数,例如 某些表中x的: 输出=某些函数(x) 新变量output是否在调用some_function()后立即进行垃圾回收?还是只在返回新值时释放内存?我只关心内核中释放的内存,不一定是系统中释放的内存(因此我可能错误地使用了术语垃圾收集)。当数据不再可访问时,Pyth

当在某个迭代任务中覆盖变量时,该变量何时被垃圾回收?例如,假设我们有一个内存密集型函数,
some_function()
。此函数还返回一个大对象,
数据

def一些_函数(x):
...
返回数据
如果在某个迭代任务期间调用此函数,例如

某些表中x的
:
输出=某些函数(x)

新变量
output
是否在调用
some_function()
后立即进行垃圾回收?还是只在返回新值时释放内存?我只关心内核中释放的内存,不一定是系统中释放的内存(因此我可能错误地使用了术语垃圾收集)。

当数据不再可访问时,Python垃圾收集器在后台将内存标记为可用于后续分配。然而,它并没有得到与内核相关的释放


如果您关心的是内核何时将物理内存提供给其他进程,那是另一回事:内存仍然虚拟地映射到Python进程的地址空间中,因此为了让内核释放物理内存,您的Python进程必须退出(从而释放分配给它的所有物理内存),或者根据内核的虚拟内存策略,以前保存数据的物理内存需要成为最近最少使用的内存。如果没有其他进程竞争它(可能在多GB系统中),这可能需要很长时间。如果有其他进程竞争物理内存,这可能会在几秒钟或几分钟内发生。此外,如果Python进程分配更多数据,这些页面会突然再次被使用,因此成为物理回收的最后一个队列。但是,如果物理内存太少,您的系统可能还有其他问题。

垃圾收集的不是变量,而是值。如果没有任何指向该值的内容,则该值将被垃圾收集。@Nf4r那么,对该值的引用是立即被覆盖,还是仅在返回某个内容并将其分配给变量后才被覆盖?首先,函数是执行时,计算值并将其分配给
输出
变量。在第二次运行时,再次执行该函数,因此有另一个值,而前一个值丢失,因为没有任何指向它的值,所以它准备进行垃圾收集,但它不会立即发生。我不是专家,也不是真正的di我已经深入研究了python垃圾收集器,但我认为它更像是周期性的“任务”。但我可能在这里错了。“我只关心内核中释放的内存”不是Python垃圾收集问题,而是一个虚拟内存替换问题——请参阅下面的答案。请仔细阅读该方法的文档,您将注意到,不能保证不再引用的值将被垃圾收集。Python不是C++。“如果您的Python进程分配了更多的数据,那么这些页面会突然再次被使用"为什么分配一个新的内存页会对进程的所有其他页面产生影响?我可以看到它们是首选的,因为它们是活动进程的一部分,但是一天内未被触及的页面肯定不会因为请求另一个页面而再次被分页?当Python分配更多数据时,很可能会出现这种情况从最近的垃圾收集区域分配。这不明显,但进程的虚拟内存空间从不(通常)收缩-所以新的分配要么增加地址空间,要么来自最近释放的内存。是的,对于给定的内核API,返回内存相当复杂,所以我不希望Python会这样做。当然,如果进程再次访问旧的“释放”(Python)页面,它会很热,我只是以不同的方式解释了你的句子。