Windows内存性能分析(一)内存泄漏

判断内存性能表现主要是为了解决如下两个问题:

1. 当前web应用是否存在内存泄漏,如果有,问题的程度有多大?

2. 如果web应用的代码无法进一步改进,当前web应用所在的服务器是否存在内存上的瓶颈,是否需要增加内存数量来提高内存?

一、内存泄漏及判断

(一)、什么是内存泄漏?

程序都需要装载在内存中才能运行,退出的时候将内存返还给系统,有两种返还方式:

1. 自行返还: 程序员编写代码的时候返还,如C++代码。

2. 自动返还:   由支持程序运行的服务平台定期自动返还给系统,如Java、.Net等。

事实上,无论以上哪种方式,程序都有可能未把自己使用的内存返回给系统,从而导致之后的程序无法再使用这些内存,这些应该返还而没有返还的内存就像从管道漏掉了一样。

因为web程序都是持续不断的运行,如果代码存在内存泄漏的问题,泄漏的内存就会越来越多,越来越严重。导致系统可用的内存资源越来越少,系统性能越来越差,用户感受到的响应时间越来越慢。

(二)、性能计数器与内存泄漏

关注Process(进程)性能对象的如下几个计数器:

Handle Count(句柄数量): 进程的每个线程当前打开的句柄总数。

Thread Count(线程数量):线程的总数。

Virtual Bytes(虚拟内存字节数): 见后面关于虚拟内存的说明。

Working Set(工作集): 和当前进程有关的那一部分物理内存。

Private Byte(私有数据字节数): 此进程无法与其他进程共享的字节数量。

虚拟内存: 计算机内存有限,需要使用内存的程序非常多,大家都把需要的代码和数据全部放在内存中是吃不消的。所以操作系统在磁盘上也为程序开辟一块存储的地盘,当作内存使用,这就是虚拟内存。

可能存在内存泄漏的情况:

1. 一般来说:Virtual Bytes 应该远大于Working Set。如果:Virtual Bytes 增长较快,Working Set增长较少, 则可能存在内存泄漏的情况。

2. 以上所有性能计数器在测试期间数值持续增长,而测试停止后仍然维持在高水平,则可能存在内存泄漏。

(三)、使用工具软件测试代码是否存在内存泄漏情况

如JProbe套件、Rational Purify、Leakdiag、BoundsChecker和CLRProfiler等软件可以在代码不那么庞大的时候就进行单元测试、组件测试,不让问题积累起来。

原文地址:https://www.cnblogs.com/tester808/p/6724629.html