python - 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
解决方案
该图看起来不像您的内存使用量“继续增加”。相反,它看起来很平坦。如果您有严重的内存泄漏,则图表会上升。
Python 进程需要从操作系统获取内存,然后使用该内存来存储您的 Python 对象。当 Python 对象被垃圾回收时,这些对象占用的内存对 Python 进程是空闲的,因为新对象可以存储在那里。但对于操作系统而言,该内存仍归 Python 进程所有,因此它正在使用中。我想您的图表显示了该 Python 进程的内存使用情况。
从操作系统获得的内存被请求的块比单个 Python 对象所需的块大得多。它也必须以更大的块返回。当 Python 对象被分配并随后被垃圾收集时,剩余的活动对象分布在巨大的内存块中。如果 Python 进程想要将内存释放回操作系统,它必须将所有对象移动到一个紧凑的区域,以便一个巨大的、连续的区域变得空闲。这个过程更容易,也更快,只需保留内存并根据需要重新使用它。
推荐阅读
- swift - 如何使用swift在tableview中打印json响应?
- ios - 多个视图上的暗模式和在暗模式 iOS 实施过程中出现的问题
- matlab - 将矩阵的负值转换为正值的方法是什么?
- java - 不断收到 java.lang.ClassNotFoundException
- ios - 在 Xcode for iOS 中针对不同屏幕尺寸调整轮播视图
- node.js - MongoDB save() 方法和版本控制
- javascript - Javascript 私有字段:为什么用“#”而不是“_”?
- mongodb - 如何检查 MongoDB 恢复时间(自动故障转移)(秒)
- qt - 动态添加更多组合框而不重置现有数据
- zsh - 当要求 Mac 上的 minikube 提供 URL 时,为什么它会在隧道中启动服务?