我使用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
这个图表看起来不像你的内存使用量“继续增加”。相反,它看起来相当平淡。如果内存严重泄漏,则图形将向上。在
Python进程需要从操作系统获取内存,然后使用该内存来存储Python对象。当对Python对象进行垃圾收集时,这些对象所占用的内存将释放给Python进程,因为可以在那里存储新的对象。但是对于操作系统来说,这个内存仍然属于Python进程,因此它正在使用中。我想您的图表显示了Python进程的内存使用情况。在
从操作系统获得的内存被请求成比单个Python对象更大的块。它也必须以大块头的形式返回。当分配Python对象并在以后进行垃圾收集时,剩余的活动对象将分布在巨大的内存块中。如果Python进程想把内存释放回操作系统,它就必须将所有对象移到一个紧凑的区域,这样一个巨大的、连续的区域就会变得空闲。这个过程更容易,也更快,只需保留内存并在需要时重新使用它。在
相关问题 更多 >
编程相关推荐