python - 究竟什么时候覆盖的变量会被垃圾回收?

标签 python garbage-collection

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

def some_function(x):
    ...
    return data

如果在某些迭代任务期间调用此函数,例如

for x in some_iterable:
    output = some_function(x)

新变量 output 是否会在 some_function() 被调用时立即被垃圾回收?还是仅在返回新值时才释放内存?我只关心内核中释放的内存,不一定在系统中(所以我可能错误地使用了垃圾收集一词)。

最佳答案

当数据不再可用时,Python 垃圾收集器会在后台将内存标记为可用于后续分配。但是,相对于内核,它不会被释放。

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

关于python - 究竟什么时候覆盖的变量会被垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58053231/

相关文章:

python - Jupyter 错误 - 给定代码段的 'the kernel appears to have died, it will restart automatically'

python - 如何仅在编辑 python 代码时加载我的 .el 文件

python - 在 python Docker 容器中安装 pip 包

.net - .NET 中的弱事件?

java - Android 中的静态场生命周期

javascript - 我可以使用传递给 Rust 的 JavaScript 对象来实现需要垃圾回收的结构吗?

.net - 从命令行运行垃圾收集器?

python - 从 excel 到 pandas df 的空单元格

python - Pyramid 目录结构困惑

java - 如何确保在销毁对象之前调用方法?