前言

前几天利用python-mpv写了一个播放器,但是跑着跑着发现内存越来越大,经过我反复调试终于解决了这个问题。

解决思路

模块定位

首先我是一个模块一个模块测试的,这样可以尽快缩减出问题的代码范围,因为我一共就写了两个模块:播放列表模块播放器模块。所以我测试到出问题的模块还是很快的,定位到了是播放器模块出来问题,我发现只要播放器模块启动,那么内存泄漏,那么就可以确定是播放器模块内部代码有资源重复加载,没有释放。

进一步定位

我通过测试,音乐播放的时候,和停止播放的时候,这两种状态下,内存的变化情况,发现,无论是否在播放的条件下,内存都会泄漏,那么这一下子就可以缩小代码范围了,也就是当构造函数执行的时候,QTimer发射信号的槽函数内部出了问题,总与我定位到了具体出问题的代码:

def setIcon(widget,type_,size):
widget.setText(iconTextData[type_])
fontId = QFontDatabase.addApplicationFont("icon/iconfont.ttf")
font = QFontDatabase.applicationFontFamilies(fontId)[0]
font.setPixelSize(size)
font = QFont(msyh)
widget.setFont(font)

关键就在于​​QFontDatabase.addApplicationFont("icon/iconfont.ttf")​​​这行代码,相当于每一次修改图标,都会添加一遍​​iconfont.ttf​​ 所以才会造成内存泄漏

那么将其独立出来,让其在构造函数中只执行一次,修改为:

def loadFont():
fontId = QFontDatabase.addApplicationFont("icon/iconfont.ttf")
msyh = QFontDatabase.applicationFontFamilies(fontId)[0]
font = QFont(msyh)
return font

def setIcon(widget,type_,size,font):
widget.setText(iconTextData[type_])
font.setPixelSize(size)
widget.setFont(font)

其他

python 中应该有类似的变量内存监测工具,但是我没找到好的工具,如果有知道的,还请各位大佬在评论中指出


作者:​​Hello_wshuo​​​