首页 > 解决方案 > Python Google App Engine 无法释放对象数组的内存

问题描述

我使用 GAE(谷歌应用引擎),制作了一个非常简单的网络应用程序。在处理请求的方法中,我只是创建了一大堆对象。之后,我删除了对数组的所有引用。之后,我打电话给 gc.collect。

但是当我长时间测试(发送请求)时,Dashboard 的内存使用量继续增加。

我看起来像内存泄漏。但我认为代码没问题。

下面是一个示例代码。

from flask import Flask, request

import gc

app = Flask(__name__)

@app.route('/', methods=['POST'])
def hello():

    gc.enable()

    bigArr = []
    for x in range(10000):
        raw_data = request.get_data(cache=False)
        bigArr.append(raw_data)
        del raw_data

    print('len(bigArr):' + str(len(bigArr)))
    del bigArr
    gc.collect()

    return 'Hello World'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

应用引擎配置:运行时:python37 自动缩放:max_instances:1

这是内存使用情况的图像: 请查看内存使用情况图片

标签: pythongoogle-app-enginememory-managementmemory-leaks

解决方案


该图看起来不像您的内存使用量“继续增加”。相反,它看起来很平坦。如果您有严重的内存泄漏,则图表会上升。

Python 进程需要从操作系统获取内存,然后使用该内存来存储您的 Python 对象。当 Python 对象被垃圾回收时,这些对象占用的内存对 Python 进程是空闲的,因为新对象可以存储在那里。但对于操作系统而言,该内存仍归 Python 进程所有,因此它正在使用中。我想您的图表显示了该 Python 进程的内存使用情况。

从操作系统获得的内存被请求的块比单个 Python 对象所需的块大得多。它也必须以更大的块返回。当 Python 对象被分配并随后被垃圾收集时,剩余的活动对象分布在巨大的内存块中。如果 Python 进程想要将内存释放回操作系统,它必须将所有对象移动到一个紧凑的区域,以便一个巨大的、连续的区域变得空闲。这个过程更容易,也更快,只需保留内存并根据需要重新使用它。


推荐阅读