Flask应用Python内存占用高怎么办_使用内存分析工具排查对象泄露

张开发
2026/4/20 1:03:48 15 分钟阅读

分享文章

Flask应用Python内存占用高怎么办_使用内存分析工具排查对象泄露
Flask开发模式下内存只涨不降主因是debugTrue触发模板自动重载导致AST缓存和源码引用无法被GC回收应禁用debug、关闭auto_reload、避免全局大对象并用tracemalloc和objgraph定位泄漏源。为什么 flask run 启动后内存只涨不降Flask 默认用 Werkzeug 开发服务器单进程多线程模式下全局变量、闭包引用、未清理的缓存或日志对象都可能长期驻留。更关键的是**开发模式下模板自动重载 debugTrue 会保留大量 AST 缓存和源码引用导致对象无法被 GC 回收**。常见现象ps aux | grep python 看到 RSS 持续上涨用 tracemalloc 发现 werkzeug.routing.Rule 或 jinja2.Template 实例数异常增长重启服务后内存回落但再次请求又爬升。禁用调试模式debugFalse哪怕只是临时测试关闭模板自动重载app.jinja_env.auto_reload False避免在模块顶层或 app 对象上挂载大对象比如读入整个 JSON 文件赋值给 app.config[DATA]用 tracemalloc 定位谁在偷偷 hold 住内存tracemalloc 是 Python 标准库中最轻量、最准的内存分配追踪工具不需要安装第三方包也不干扰 Flask 生命周期。重点不是“总内存多少”而是“哪些调用路径持续分配新对象且没释放”。实操建议立即学习“Python免费学习笔记深入”在应用启动前就开启import tracemalloc; tracemalloc.start()在可疑路由里拍快照snapshot1 tracemalloc.take_snapshot()等几轮请求后再拍 snapshot2用 snapshot2.compare_to(snapshot1, lineno) 查差异过滤掉标准库路径聚焦你自己的模块filter tracemalloc.Filter(inclusiveTrue, filename_pattern*/myapp/*)注意tracemalloc 本身有开销别长期开着定位完就关tracemalloc.stop()objgraph 显示谁在阻止 GC —— 尤其适合查循环引用Flask 中很多泄露不是因为分配得多而是因为对象被意外强引用比如函数闭包捕获了 request context或信号回调里存了 response 对象。objgraph 能可视化引用链比看 gc.get_referrers() 直观得多。 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

更多文章