我注意到一个非常有趣的发现。我正在测试我的应用程序涉及一个自定义的GUI元素,该元素由来自外部源的数据更新。每当数据到达串行端口时,GUI的更新都使用插槽(Qt特定细节)功能完成。现在数据以每秒10个数据包的速率传输,即更新GUI功能每秒被调用10个数据包。除了不断增加内存占用量之外,这还会降低应用程序的速度。它起始于60 MB,并在几个小时内增加到65 MB。
我的结论是更新GUI很慢,当每秒调用10次更新插槽时,插槽调用会在长时间内排队,从而降低应用程序响应时间。
我通过缓存传入值并在传入值发生更改时更新GUI来解决此问题。
我尝试了各种免费工具,如valgrind-memcheck,泄漏检查器,但结果没有帮助,实际上泄漏检查器没有找到泄漏,但我的程序内存大小不断增加。这是否意味着它是因为信息插槽连接的排队,因为GUI更新本质上很慢?
现在问题在于此。追踪内存泄漏是很困难的,如果涉及到Qt,那么倒霉的程序员怎么能确定问题,即它实际上是内存泄漏还是信号插槽连接的排队?
答案 0 :(得分:1)
内存可能会碎片化。如果页面对齐并且页面大小的倍数,AFAIK内存仅返回给操作系统。一些内存分配器永远不会给回记忆,googles malloc浮现在脑海中。
因此,如果Qt或您的应用程序不断mallocs并释放随机不同大小的小块,则可以保留内存。尽管如此,内存占用量的增加应该会减慢。
如果要更新某些类似QWidget的对象,请确保使用update()而不是重绘()。
答案 1 :(得分:0)
这是否意味着它是因为 将信号槽连接排队为 GUI更新本质上很慢?
是......
停止发生事件,一段时间后必须释放你的记忆。