python(64) 内存的几个现象,主动释放内存

​1.主动释放内存的方式

在 Python 中使用 gc.collect() 方法清除内存  

使用 del 语句清除 Python 中的​​​​​​ ​内存

gc.collect(generation=2) 方法用于清除或释放 Python 中未引用的内存。未引用的内存是无法访问且无法使用的内存。可选参数 generation 是一个整数,值的范围是 0 到 2。它使用 gc.collect() 方法指定要收集的对象的生成。

在 Python 中,寿命短的对象存储在 0 代中,而寿命较长的对象存储在 1 或 2 代中。每当调用具有默认 generation 值等于 2 的 gc.collect() 时,将清除垃圾收集器维护的列表。

gc.collect() 方法可以帮助减少内存使用,并在程序执行期间清除未引用的内存。通过清除内存中不可访问的数据,它可以防止程序用尽内存并崩溃。

与 gc.collect() 方法一起,del 语句对于在 Python 程序执行期间清除内存非常有用。del 语句用于删除 Python 中的变量。我们可以首先删除该变量,例如一些大列表或数组等,我们确定程序不再需要这些变量。

del 语句将变量从名称空间中删除,但不一定将其从内存中清除因此,在使用 del 语句删除变量之后,我们可以使用 gc.collect() 方法从内存中清除变量。

下面的示例代码演示了如何将 del 语句与 gc.collect() 方法一起使用,以清除 Python 中的内存。

import numpy as np
import gc

a = np.array([1, 2, 3])
del a
gc.collect()

2.动态监控内存使用

使用一些工具如tracemalloc来监控循环中的内存使用情况,这有助于识别并解决内存泄漏问题。

在循环状态下高效释放Python内存,可以通过上述方法来提升代码的性能。关键在于了解和利用Python的内存管理机制,合理使用变量、删除无用的对象,采用生成器来减少内存占用,并及时打断循环引用,必要时手动触发垃圾回收。通过这些方法,可以很大程度上保证在大量数据处理或长时间运行的程序中内存的有效管理。

3.使用gc获取时,内存占用越来越大

此程序会导致内存占用越来越大,去掉gc.get_objects() 则不会越来越大

import gc
import time
import random
def demo1(x):
    """

    :param x:
    :return:
    """
    a = {"fsdf":"sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf2": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf3": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf4": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf5": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf6": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf7": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf8": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf9": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf10": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         "fsdf11": "sluifhanvndfndnsddfvdfxssfeddddddddddddddddddddddddddddddddddddd",
         }

while True:
    demo1(1)
    time.sleep(0.01)
    objs = gc.get_objects()
    #print(len(objs))
    #gc.collect()

参考文档

gc --- 垃圾回收器接口 — Python 3.12.4 文档

在 Python 中清除内存 | D栈 - Delft Stack

你可能感兴趣的:(Python,python)