Python Google应用引擎无法释放对象数组的内存

2024-09-29 21:32:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用GAE(googleappengine),制作一个非常简单的web应用程序。 在处理请求的方法中,我只创建了一个大的对象数组。 之后,删除对数组的所有引用。 之后,我打电话gc.收集. 在

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

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

下面是一个示例代码。在

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 自动缩放: 最大实例数:1

以下是内存使用情况的图像: Please View the image of memory usage


Tags: 内存代码nameimportappflaskdataraw
1条回答
网友
1楼 · 发布于 2024-09-29 21:32:28

这个图表看起来不像你的内存使用量“继续增加”。相反,它看起来相当平淡。如果内存严重泄漏,则图形将向上。在

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

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

相关问题 更多 >

    热门问题