tracemalloc分析内存使用情况与泄露
admin
2024-03-04 02:09:18
0

tracemalloc分析内存使用情况与泄露

1.概述

python内存管理是通过引用计数执行的,如果指向某个对象的引用全部过期,那么受引用的对象就可以从内存中清除,从而给其他数据腾出空间。理论上讲,python开发不用担心程序如何分配和释放内存,因为python系统本身以及Cpython运行环境会自动处理这些问题。
但实际情况程序会因为没有及时释放不再需要引用的数据耗尽内存。下面通过一些方法来看下内存使用情况。

2.查看gc引用对象总数

下面是被测试代码,这个代码可以创建对象,在gc中产生引用对象。

import osclass MyObject:def __init__(self):self.data = os.urandom(100)def get_data():values = []for _ in range(100):obj = MyObject()values.append(obj)return valuesdef run():deep_values = []for _ in range(100):deep_values.append(get_data())return

下面的代码用来输出当前gc引用对象的数量

import gc# 获取运行前gc引用对象数量
found_objects = gc.get_objects()
print('Before:', len(found_objects))# 导入待测试模块
import waste_memory# 运行待测试代码的函数
hold_reference = waste_memory.run()# 获取运行代码后gc引用对象数量
found_objects = gc.get_objects()
print('After: ', len(found_objects))
for obj in found_objects[:5]:print(repr(obj)[:100])print('...')

运行上面的代码,下面是gc引用的对象总数。

Before: 28834
After:  28923

3.tracemalloc查看内存分配情况

3.1.查看内存分配情况

上面只输出了gc的总数,对于分析内存分配情况没有太多的指导意义,tracemalloc模块能够追溯到分配它的位置,因此我们可以在之前模块前后对内存使用情况做个快照,分析两个快照之间的区别。

下面是被测试代码

import tracemalloctracemalloc.start(10)                      # Set stack depth
time1 = tracemalloc.take_snapshot()        # Before snapshotimport waste_memoryx = waste_memory.run()                     # Usage to debug
time2 = tracemalloc.take_snapshot()        # After snapshotstats = time2.compare_to(time1, 'lineno')  # Compare snapshots
for stat in stats[:3]:print(stat)

运行上面的代码,从结果中可以看出,每一条记录都有size与count指标,用来表示这行代码所分配的对象占用多少内存,以及对象的数量。通过对比就能发现占用内存较多的对象是由那几行代码分配的。

/waste_memory.py:11: size=5120 B (+5120 B), count=80 (+80), average=64 B
/waste_memory.py:14: size=4424 B (+4424 B), count=79 (+79), average=56 B
/waste_memory.py:9: size=1704 B (+1704 B), count=8 (+8), average=213 B

3.2.查看栈信息

tracemalloc还可以打印栈的追踪信息,下面把程序中分配内存最多的那行代码所对应的栈追踪信息打印出来,看看程序是沿着哪条路径触发这行代码的。


import tracemalloctracemalloc.start(10)
time1 = tracemalloc.take_snapshot()import waste_memoryx = waste_memory.run()
time2 = tracemalloc.take_snapshot()stats = time2.compare_to(time1, 'traceback')
top = stats[0]
print('Biggest offender is:')
# 打印栈信息
print('\n'.join(top.traceback.format()))

运行上面的代码

Biggest offender is:File "/with_trace.py", line 14x = waste_memory.run()File "/waste_memory.py", line 23deep_values.append(get_data())File "/waste_memory.py", line 16obj = MyObject()File "/waste_memory.py", line 11self.data = os.urandom(100)

相关内容

热门资讯

利率变化对黄金行情影响如何分析... 利率作为经济领域的关键变量,其变化对金融市场的各个方面都有着深远影响,其中黄金市场也不例外。分析利率...
独家|原材料价格攀升,盛弘股份... 图源:视觉中国 蓝鲸新闻7月11日讯(记者 翟智超)一家横跨新能源与AI基础设施的龙头企业官宣全面提...
马斯克承认对手更强!但仍要求员... 快科技7月11日消息,据报道,特斯拉CEO埃隆·马斯克在一份备忘录中表示,鉴于Grok 4.5的To...
美亿万富豪:美国被掏空了,苹果... 据《财富》杂志网站7月8日报道,美国防务科技企业安杜里尔公司(Anduril)创始人、亿万富豪帕尔默...
泡泡玛特跌跌不休,段永平继续补... 在举牌泡泡玛特之后,段永平还在持续买入。 港交所最新数据显示,段永平再度增持泡泡玛特,持股数量由91...
基金合同为何重要运作机制更关键... 在基金投资领域,基金合同和运作机制是两个极其重要的元素,它们在基金的整个生命周期中扮演着关键角色。 ...
原创 外... 长征十号乙的一级箭体 7月10日中午,长征十号乙从海南商业航天发射场升空。火箭将卫星送入预定轨道后,...
期货交易中如何判断主力合约即将... 在期货交易里,准确把握主力合约换月时机对投资者至关重要,它直接影响到交易策略的制定与执行。以下是一些...
陈杰George Chan,安... 问AI· 陈杰的审计背景将如何影响IPO审核流程? 香港交易所全资附属公司香港联合交易所有限公司 ...
三环集团在香港联合交易所主板上... 转自:潮州发布 7月9日,三环集团在香港联合交易所主板成功上市,股票代码6951,成为潮州首家"A...
百亿资金持续加仓!段永平:泡泡... 继续买买买!段永平对泡泡玛特的持续加仓,再次引发市场关注。 7月10日,港交所最新权益披露信息显示,...
蚌埠港上半年集装箱吞吐量突破8... 初夏时节,蚌埠港新港作业区码头一片繁忙,岸桥有序起落,满载货物的集装箱船舶往来穿梭。2026年上半年...
AI“小登股”集体洗牌,是泡沫... 科技板块从“无差别抱团”走向分化,业绩能否超预期将成为关键分水岭。 超七成“小登股”回撤20%以上 ...
夏季达沃斯:万亿AI投资后的世... 今年夏季达沃斯,AI成为当之无愧的焦点。十余场分论坛讨论AI议题,三十余场涉及AI在制造、能源、医疗...
风险等级如何影响申赎安排更合理... 在基金投资中,风险等级是一个关键的考量因素,它对申购赎回安排有着重要的影响,合理的安排能够帮助投资者...
马斯克再出狂言:目标让Spac... 7 月 11 日消息,SpaceX CEO 埃隆 · 马斯克多年来一直靠向投资者描绘科幻式未来,为自...
一边抱紧AI、一边提防伊朗惊雷... 智通财经获悉,本周,华尔街走出了极度割裂的极端行情。伊朗局势传出新动向,一度引发原油、美债收益率和外...
原创 千... 原创首发 | 金角财经(ID: F-Jinjiao) 作者 | 周松 一年新增14000多家门店后...
西安银行[600928]日常公... 本版导读 2026-07-11 2026-07-11 2026-07-11 2026...
菏泽正规的优化网站制作哪家好 引言 在当今数字化时代,拥有一个高质量的网站对于企业和个人都至关重要。菏泽作为一个快速发展的城市,网...