KFileMonitor内存泄漏分析报告

【摘要】 本报告采用VMMap内存分析工具、VLD内存泄露分析工具,对KFileMonitor项目的内存占用情况、内存泄露问题以及内存优化方案进行说明。报告中将对各个分析工具的使用进行说明,分析以降低特定功能的内存使用量、排查内存占用异常上涨为目的,通过中断分析调用栈、记录内存分配比较差异的方法来进行。 【关键词】 内存泄漏、内存优化

一、项目内存占比分析

VMMap是对进程所用虚拟、物理内存进行分析的工具,可以统计进程所使用的虚拟、物理内存并以条形图与文字的形式进行呈现。VMMap的过滤和刷新功能可以及时观察进程内存使用的来源以及占用情况。 运行KFileMonitor项目,并使用VMMap工具进行检测,可首先观察到如下界面。

KFileMonitor memory leak anaysis - 图1

其中顶部为进程基本信息,下部为各类类型空间占用条形图。Committed表示进程向操作系统所申请的需要使用到的虚拟内存大小;Private Bytes表示进程所私用使用的虚拟内存大小;Working Set表示进程目前所使用的物理内存大小。 从图中可知,KFileMonitor项目启动后,虚拟内存分配空间大小为51248K,项目所私有使用的虚拟内存空间大小为2140K,进程所实际使用的物理内存空间大小为10284K。 在工具的中部区域,对进程内存总体信息进行了进一步分析

KFileMonitor memory leak anaysis - 图2

横向表头分别代表总体内存大小、申请内存大小、私有内存大小,总体物理内存带下、私有物理内存大小、共享物理内存大小等类型。纵向表头代表总体、进程自身可执行文件以及包含的所有库、内存映射文件、共享内存、堆区空间、栈区空间等类型。其中new与malloc等分配的空间为堆区域,栈区域空间会主动释放,因此进一步对堆区空间进行分析。

KFileMonitor memory leak anaysis - 图3

二、项目内存泄露点

Visual Leak Detector,它是一款用于 Visual C++免费的内存检测工具。VLD可以得到内存泄漏点的调用堆栈、泄露内存的完整数据,还可以设置内存泄露报告的级别。在VS项目中,加上头文件后运行一次程序,即可得到内存泄露分析结果。可以检测出疑似内存泄露的具体行号,new生成的对象使用完毕后未及时释放,因此发生内存泄露。

KFileMonitor memory leak anaysis - 图4

项目编写过程中遇到的泄漏点:

多线程内存释放

KFileMonitor memory leak anaysis - 图5

KFileMonitor memory leak anaysis - 图6

QAction类释放内存

Qaction不会自动释放。

KFileMonitor memory leak anaysis - 图7