Python Google App Engine无法释放对象数组的内存

Sea*_*Sea 10 python google-app-engine memory-leaks memory-management

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

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

我看起来像内存泄漏。但是我认为代码还可以。

下面是示例代码。

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)
Run Code Online (Sandbox Code Playgroud)

App引擎配置:运行时:python37 automatic_scaling:max_instances:1

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

Rol*_*ber 2

该图看起来您的内存使用量并没有“继续增加”。相反,它看起来相当平坦。如果出现严重的内存泄漏,图表将会上升。

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

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