内存泄露简单判断
简单的说就是你申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是
程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。一般我们常说的
内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小
可以在程序运行期决定),使用完后必须显示释放的内存。C应用程序一般使用malloc,
realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或
delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
测试方法:
打开任务管理起察看性能记录当前内存使用量,然后启动你的被测试程序,运行使用
相应的功能,察看内存使用情况,任务管理器切换到进程页面,然后看内存使用栏目,察
看进程内存使用增量情况,使用程序一段时间然后关闭进程,察看总体内存增量。若程序
运行之前和运行之后对比没有什么变化,我们则认为不存在内存泄露,若程序运行之后比
运行之前要大的话(所有进程关闭的情况下),我们则可以认为有可能存在内存泄露情况
。当确认有内存泄露之后可以进一步进行定位,确认是在多用户情况下出现,还是在单用
户情况下出现,如果是多用户情况下出现可以利用lr进行测试,并添加一些性能计数器如
Available bytes、Private bytes、Handle count、Thread counts等进行判断,如果
Process\Private Bytes计数器和Process\Working Set计数器的值持续升高,同时
Memory\Available bytes计数器的值却持续降低的话,说明很有可能是存在内存泄漏。同
时我们注意Pages/sec、Pages Read/sec和Page Faults/sec的值,操作系统会利用磁盘较
好的方式提高系统可用内存量或者提高内存的使用效率。这三个指标直接反应了操作系统
进行磁盘交换的频度。如果Pages/sec的计数持续高于几百,可能有内存问题。但
Pages/sec值不一定就表明有内存问题,可能是运行使用内存映射文件的程序所致。Page
Faults/sec说明每秒发生页面失效次数,页面失效次数越多,说明操作系统向内存读取的
次数越多。此事需要查看Pages Read/sec的计数值,该计数器的阀值为5,如果计数值超
过5,则可以判断存在内存方面的问题。(注:在UNIX/LINUX系统中,对于指标是(page)
si和(page)so);我们还可以根据Physical Disk计数器的值分析性能瓶颈,对Physical
Disk计数器的分析包括对Page Reads/sec和%Disk Time及Aerage Disk Queue Length的分
析。如果Pages Read/sec很低,同时%Disk Time和Average Disk Queue Length的值很高
,则可能有磁盘瓶颈。但是,如果队列长度增加的同时Pages Read/sec并未降低,则是内
存不足。(注:在 UNIX/LINUX系统中,对应的指标是Reads(Writes)per sec、Percent
of time the disk is busy和Average number of transactions waiting for service)
如果单用户情况下出现可以利用单元测试工具进行定位,利用unit testing tool和语言
有关系,找到符合你应用的语言工具进行判断和定位。