python - 如何在Python中释放堆内存

标签 python memory-leaks heap-memory

我来自 C++,我在堆内存上工作,在那里我必须删除我使用“new”关键字在堆上创建的堆内存,我总是很困惑在 python 中该怎么做才能停止堆内存内存泄漏请推荐我任何有关Python内存分配和删除详细信息的文本。谢谢

最佳答案

您无需执行任何操作:Python 首先使用引用计数。这意味着,对于每个对象,它都拥有一个计数器,当您通过新变量引用该对象时,该计数器会递增;如果您让该变量指向其他对象,则该计数器会递减。如果计数器为零,则该对象将被删除(或计划删除)。

但这还不够,因为两个对象可以互相引用,因此即使没有其他变量引用这些对象,这些对象也会使彼此保持事件状态。为此,Python 有一个(可选)垃圾收集器来进行循环检测。如果发现此类循环,则删除对象。您可以通过调用gc.collect()来安排此类收集。

简而言之:Python 本身负责内存管理。当然,您的任务是确保对象可以被释放。例如,明智的做法是不要超过必要的时间来引用大对象。例如,您可以使用 del 关键字来执行此操作:

foo = ... # some large object

# ...
# use foo for some tasks

del foo

# ...
# do some other tasks

通过使用del,我们删除了foo变量,因此我们也减少了引用foo所引用的对象的计数器。因此,foo 所引用的对象也可以安排删除(之前)。当然,编译器/解释器可以进行 active 分析,并且可能会发现自己不再使用 foo,但最好是安全而不是遗憾。

简而言之:Python 通过使用引用计数和垃圾收集器来管理内存本身,您需要担心的是,如果不再需要这些对象,那么没有那么多对象仍然“活着”.

关于python - 如何在Python中释放堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001112/

相关文章:

java - 连续 CMS 收集后并发模式失败

python - Scrapy Spider Xpath 图像 URL

python - PyTorch - 尽管检测到 CUDA 支持,但张量并未使用 GPU

objective-c - 使用垃圾收集时,新创建的 Cocoa 应用程序会出现内存泄漏吗?

C++内存泄漏会导致内存错误吗?

heap-memory - 使用 Jena/ARQ 在 sparql 查询到 D2R 之间等待 - 堆空间

java - Android 中的堆转储和内存使用差异?

python - 带有 gdal、ogr 等的 python 中带有 shapefile 的 GTiff 掩码

python - manage.py - 导入错误 : No module named django

android - 使用位图和 Volley 查看寻呼机内存泄漏