记录一次PyQt5内存泄漏的问题解决
前言
前几天利用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 中应该有类似的变量内存监测工具,但是我没找到好的工具,如果有知道的,还请各位大佬在评论中指出
记录一次PyQt5内存泄漏的问题解决的更多相关文章
- MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决
问题: 在进行点击按钮弹出对话框时,我是用了new来生成一个新的对话框,但是在新对话框关闭的时候,经过检查发现,新对话框存在内存泄漏问题. 原因: 因为使用了new,但是当时没有找到地方进行delet ...
- 了解 JavaScript 应用程序中的内存泄漏
简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...
- Vc 检测内存泄漏
启用内存泄漏检测 检测内存泄漏是 C/c + + 调试器和 C 运行时库 (CRT) 的主要工具调试堆函数. 若要启用调试堆的所有函数,在 c + + 程序中,按以下顺序包含以下语句: C++复制 # ...
- JavaScript内存泄漏知多少?
垃圾回收解放了我们,它让我们可将精力集中在应用程序逻辑(而不是内存管理)上.但是,垃圾收集并不神奇.了解它的工作原理,以及如何使它保留本应在很久以前释放的内存,就可以实现更快更可靠的应用程序.在本文中 ...
- 一次完整的JVM堆外内存泄漏故障排查记录
前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...
- Android内存管理(5)*官方教程:Logcat内存日志各字段含义,查看当前内存快照,跟踪记录内存分配,用adb查看内存情况时各行列的含义,捕获内存快照的3种方法,如何让程序暴漏内存泄漏的方法
Investigating Your RAM Usage In this document Interpreting Log Messages 内存分析日志中各消息的含 ...
- springboot-23-aspectj日志记录及threadlocal内存泄漏
对于请求参数的处理和响应, 如果在代码中体现日志会显得很繁琐, 普遍的解决方案是使用spring的切面方案去解决. 这儿使用的是springboot的切面: http://www.cnblogs.co ...
- linux中内存泄漏的检測(五)记录内存泄漏的代码
到眼下为止,先后通过wrap malloc.new函数重载和计算指针内存大小的方法.基本上满足了对内存泄漏检測的须要. 假设发现了内存泄漏.那么就要找到内存泄漏的地方而且修正它了. 茫茫代码.如何去找 ...
- vue自定义指令导致的内存泄漏问题解决
vue的自定义指令是一个比较容易引起内存泄漏的地方,原因就在于指令通常给元素绑定了事件,但是如果忘记了解绑,就会产生内存泄漏的问题. 看下面代码: directives: { scroll: { in ...
- Instruments的使用 逻辑查错,内存泄漏分析等工具集
原创文章,转载请注明 XCode 开发后期,要对代码进行改进和优化,查内存泄漏是其中一项重要工作,今天下午偷了点时间,把前段时间的代码稍微整理了一下,顺带用了下这个工具,还真发现了些问题.这里记录一下 ...
随机推荐
- 关于指针初始化为NULL的一些问题
关于指针初始化问题,先看以下代码: #include <stdio.h>typedef struct{ char data[128]; int top;} Stack;voi ...
- C语言大作业---学生信息管理系统
xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样.现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作业是没问题的 实验报 ...
- 使用elasticdump迁移es数据
安装elasticdump github地址:https://github.com/elasticsearch-dump/elasticsearch-dump # yum -y install npm ...
- yaml文件执行后常见错误解决
yaml文件中个别数值有大写,报错信息如下 : The Deployment "my-nginx" is invalid: spec.template.spec.volumes[0 ...
- MongoDB 副本集故障情况描述
副本集有两种类型三种角色 两种类型: 主节点( Primary)类型:数据操作的主要连接点,可读写. 次要(辅助.从)节点( Secondaries)类型:数据冗余备份节点,可以读或选举. 三种角色: ...
- k8s中使用到的各种证书图示
- Java 基础三、接口与内部类
1. 在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...
- MySQL学习(4)---MySQL索引
ps:没有特殊说明,此随笔中默认采用innoDB存储引擎中的索引,且索引都是指B+树(多路平衡搜索树)结构组织的索引.其中聚集索引.复合索引.前缀索引.唯一索引默认都是使用B+树,统称为索引. 索引概 ...
- (五)JPA - 原生SQL实现增删改查
6.原生SQL JPA除了对JPQL提供支持外,还对原生SQL语句也提供了支持.下面小节一起来看看吧. 6.1 查询单个 示例代码: @Test public void getSingle() { E ...
- 云原生虚拟网络 tun/tap & veth-pair
云原生虚拟网络 tun/tap & veth-pair 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/684 ...