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

一、项目内存占比分析

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

KFTPClient内存泄漏分析报告 - 图1

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

KFTPClient内存泄漏分析报告 - 图2

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

KFTPClient内存泄漏分析报告 - 图3

二、项目内存泄露点

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

KFTPClient内存泄漏分析报告 - 图4

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

KFTPClient内存泄漏分析报告 - 图5

原因分析:在KListCommand类中,new了KTcpClient类创建socket,KPortCommand类与KPasvCommand类封装PORT和PASV命令包,在KListCommand类的析构函数~KListCommand()中,delete 三个new并不能释放堆区空间,需要在函数体中,new完、使用完、立即delete。

总结:在哪new,在哪delete!!!!!!

KFTPClient内存泄漏分析报告 - 图6

KFTPClient内存泄漏分析报告 - 图7