内存泄露指进程自己申请分配、使用了内存但没有在使用完毕后释放,大量的泄露会导致物理内存用满,降低系统效率。
如何判断一个进程有没有内存泄露?
1)看进程的数据段
AIX中使用ps gv命令观察特定进程的SIZE指标,如果SIZE经过长时间测试后,不断增长,则可能有内存泄露的嫌疑,这里说的是嫌疑,而不是一定。况且,查看进程的SIZE值也只能查看这个进程使用的一部分内存,而这个进程使用的Shared Memory Segment则不在这个指标中。如果是JAVA程序由于涉及到JVM的内存管理,问题就更难判断的,我们先放下JAVA程序不表,单说C的程序。
ps gv命令中SIZE就是该进程数据段的virtual size(1KB为单位),这些分页可能在物理内存中也可能在Paging Space中。检查SIZE列在长期的测试过程中是否有明显的持续增长,如有,说明可能有内存泄露。长期的抓取和后期的图形化处理,可以写脚本或代码来实现。
其他命令也可以看到这个值,“svmon –P 进程号”可以看work process private的virtual大小+work shared library data的virtual大小。如果有text data BSS heap、USLA heap、application stack、private load data等segment,还需把这些segment也加上。由于svmon中统计的segment较多,因此不推荐采用svmon统计Data Segment。
2)进程的共享内存段
由于内存泄露问题非常复杂,可以参考我的文章:
会怀疑内存有泄露的情况:内存使用量不断增高,nmon监控free不断减少,最终可能导致机器hang死。
判断和定位:判断方法大体基本如上,具体方法使用SVMON监控,主要查看work process private行inuse列等,如果占用内存持续增长,一直不释放,即内存泄漏。
收起