Python 程序内存占用越来越大,有没有办法直接查看对象数目而不修改代码?
在网上看了几个内存泄露分析工具,都要 import 什么,或者加一个装饰器
有没有那种直接在系统里运行,就能检测别的 python 进程内存使用情况的工具?
Python 程序内存占用越来越大,有没有办法直接查看对象数目而不修改代码?
在系统里运行,你是说一个单独的 binary 文件?
可以用 gc.get_objects() 配合 collections.Counter 来直接看。这方法不用改你原来的代码,在需要的地方插几行就行。
import gc
from collections import Counter
# 获取当前所有被垃圾回收器追踪的对象
all_objs = gc.get_objects()
# 统计每种类型的对象数量
type_counts = Counter(type(obj).__name__ for obj in all_objs)
# 打印最常见的N种对象
for obj_type, count in type_counts.most_common(20):
print(f"{obj_type}: {count}")
跑一下这个,你就能看到当前内存里哪种对象最多。比如 list、dict、str 这些是不是在疯狂增长。如果想看某个具体类的实例数,比如你自己定义的 MyClass,可以这么过滤:
my_class_count = sum(1 for obj in all_objs if type(obj).__name__ == 'MyClass')
print(f"MyClass instances: {my_class_count}")
注意:gc.get_objects() 返回的列表本身挺大的,在内存已经很高的时候用可能会雪上加霜,最好在程序刚启动或者内存还OK的时候先打个样。另外,线上环境别这么玩,太影响性能。
简单说,用 gc.get_objects() 快速扫一眼对象分布,重点盯那些数量异常增长的类型。
也可以是别的 python 文件什么的,暂时没法重启那个 内存泄露的服务,更别说改代码了
应该是有吧
https://gist.github.com/simonw/8aa492e59265c1a021f5c5618f9e6b12
这里提到了一种向运行中的 Python 程序关联 shell 的方法,不确定是否对解决这一问题有帮助。
systemtap 是一个好方法,但是需要编译 Python 的时候把一些点提前埋进去。我记得 CentOS 默认的 Python 是带的,可以直接用。其他系统 Python 需要自己打 patch 。
3.6 之后编译加参数就行了。
pyrasite-shell 或 flask 提供一个看 memory 的接口就可以
检查内存泄漏很麻烦的,命令行程序的话你定时重启就完了
https://github.com/emfree/systemtap-python-tools 脚本看 scripts/memtrace.stp 就可以了
看对象的数目是没有用的
Leak 的对象在 python 里是看不见的
这个时候就知道 Java 的好了,哈哈
可以借助 pyrasite


