调查内存使用情况
在Linux平台,Qt Creator集成了Valgrind的memcheck工具, 该工具没有Windows版本,因此我们必须寻找其他工具。然而,在我们介绍专用工具之前,让我们先看看Windows系统工具。
最简陋的内存剖析技术
出人意料的是,有些时候,使用老而可靠的Process Explorer工具也可以干很多事情,我们在本章前面的Windows系统工具一节中介绍过这个工具。现在让我们以一个实际例子来讨论这个工具吧。
在一个我的客户的项目中,有个Qt应用程序从摄像头中取帧的时候会遇到超时。这被认为是一个性能问题,于是我开始了调查。在第一次测量中,我启动了一次长帧采集,并用Process Manager的Performance Graph视图监视该问题程序的运行行为。你可以发现测量值的时间序列如下图所示:

可以看出来内存使用率先是直线上升之后迅速回落。并且发现取帧超时发生在内存使用率曲线的下降沿。据此推测,可能是内存释放过程阻碍了取帧。迅速查看了一下调试日志就确定了这个猜测:
AppMainWindow::outOfMemoryHandler() -> leaving out of memory handler
ImageCollector::waitForImage(): timed out !!!!
最后发现主窗口会释放过剩的内存,从而阻塞了Qt的主消息循环,所以当ImageCollector被调度时,其内部定时器已经失效了。当然,这是一个缺陷,而非真正的性能问题,因为取帧过程运行在另一个线程。
网友评论