阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Python实现内存泄露排查的示例

337次阅读
没有评论

共计 2499 个字符,预计需要花费 7 分钟才能阅读完成。

导读 一般在 python 代码块的调试过程中会使用 memory-profiler、filprofiler、objgraph 等三种方式进行辅助分析,今天这里主要介绍使用 objgraph 对象提供的函数接口来进行内存泄露的分析,感兴趣的可以了解一下

一般情况下只有需要长期运行的项目才会去关注内存的增长情况,即使是很小部分的内存泄露经过长期的运行仍然会产生很大的隐患。

python 本身也是支持垃圾的自动回收的,但是在特定的情况下也是会出现内存泄露的问题的。

比如对于很多全局的列表 (list)/ 字典(dict) 等对象在经过不断的数据赋值而没有进行手动回收,或者某些对象被不停的循环引用而不能及时的进行回收等都会产生内存泄露的情况。

一般在 python 代码块的调试过程中会使用 memory-profiler、filprofiler、objgraph 等三种方式进行辅助分析,今天这里主要介绍使用 objgraph 对象提供的函数接口来进行内存泄露的分析。

objgraph 是 python 的非标准模块,因此需要使用 pip 的方式安装一下。

pip install objgraph

更多详细的介绍可以访问下面的官方地址进行查看。

https://mg.pov.lt/objgraph/

接下来就可以直接将 objgraph 导入到我们的代码块中进行使用了。

# Importing the objgraph module and renaming it to graph.
import objgraph as graph

这里初始化一组字典类型的数据对象。

dict_ = {'姓名': ['Python', 'Java', 'Scala'],
    '年龄': ['21', '22', '19']
}

通过 objgraph.count()函数,可以统计出 GC 中的 dict_对象的数目是多少。

# Counting the number of dict_ objects in the GC.
print(graph.count(dict_))

和 objgraph.count()函数对应的是可以使用 by_type 返回该对象在 GC 中的列表,若是 GC 返回的为空的列表说明已经被回收了。

# Returning a list of dict_ objects in the GC.
print(graph.by_type(dict_))

在统计内存泄露时比较好用的函数就是 graph.show_growth()函数,可以统计自上次调用以来增加得最多的对象。

# Showing the growth of objects in the memory since the last time it was called.
print(graph.show_growth())
 
# function                       3013     +3013
# tuple                          1463     +1463
# dict                           1417     +1417
# wrapper_descriptor             1178     +1178
# ReferenceType                   883      +883
# method_descriptor               814      +814
# builtin_function_or_method      794      +794
# getset_descriptor               514      +514
# type                            463      +463
# list                            436      +436
# None

可以根据返回结果中的对象每次增加的数量来判断内存泄露的相关情况。

还有一个比较常用的分析函数就是 graph.show_most_common_types(),可以按照从大到小的方式列出对象实例比较多的情况。

# Showing the most common types of objects in the memory.
print(graph.show_most_common_types())
 
# function                   3013
# tuple                      1463
# dict                       1417
# wrapper_descriptor         1178
# ReferenceType              883
# method_descriptor          814
# builtin_function_or_method 794
# getset_descriptor          514
# type                       463
# list                       436
# None

最后一个比较使用函数就是 show_backrefs 函数,使用它可以分析出内存泄露的原因是什么。

它会生成一张有关 objs 的引用图,可以看出对象为什么不释放?只是调用该函数时的参数比较多,下面是该函数的接口。

# def show_backrefs(objs, max_depth=3, extra_ignore=(), filter=None, too_many=10,
#                   highlight=None, filename=None, extra_info=None,
#                   refcounts=False, shortnames=True, output=None,
#                   extra_node_attrs=None):

我们还是和上面一样使用 dict_作为对象进行分析。

# Showing the back references of the dict_ object.
graph.show_backrefs(dict_)

执行完成后 dot 类型的图片已经生成了,发现出现了下面的错误,意思是没有发现支持 dot 的图像组件。

# Graph written to C:\Users\86159\AppData\Local\Temp\objgraph-dkqm85f0.dot (4 nodes)
# Graph viewer (xdot) and image renderer (dot) not found, not doing anything else

可以使用 pip 的方式分别安装 graphviz xdot,这两个 python 的非标准模块。

pip install graphviz xdot

若是查看.dot 决策树图像可以使用 graphviz 工具,可以到下面地址进行下载安装。

https://graphviz.org/download/

安装完成后配置环境变量,然后重启开发工具(这里使用的是 pycharm)即可。

到此这篇关于 Python 实现内存泄露排查的示例详解的文章就介绍到这了

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2499字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7802818
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
使用1Panel面板搭建属于你的AI项目环境

使用1Panel面板搭建属于你的AI项目环境

使用 1Panel 面板搭建属于你的 AI 项目环境 在 AI 项目越来越火的今天,很多朋友都想自己动手搭建一...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...