内存泄露是c语言永恒的话题,同样是从书上看到了内存泄露检查方法,堆常出现两种类型的问题:
- 释放或改写仍在使用的内存(“内存损坏”)
- 未释放不在使用的内存(“内存泄露”)
主要症状:罪魁进程速度会愈来愈慢;原因体积大的进程更有可能被系统换出,让别的进程运行,而且大体积的进程在换入换出的时候花费的时间更多。即使泄露的内存未被使用但是它仍可能存在页面中,
增加了工作页的数量,降低了性能。另外注意泄露的内存要比申请的数据结构要大,因为malloc所分配的内存统称会圆整为下一个大于申请数量的2的整数此方(比如申请212B会被圆整为256B)。从理论上讲,进程大小有个固定值,即使内存未达到这个数量,磁盘的交互区已经消耗殆尽了。检测方法:- 用命令查询swap使用情况,在一分钟内部键入该命令3-4次,看看交换区是否在减少,还可以使用其他工具,比如netstat ,vmstat。如果发现内存不断有内存被分配且从不释放,可能就是内存泄露。
- 确定可疑进程,可以用过命令”ps -lu 用户名“ 查看进程的大小,标题为SZ的列标示进程的大小(如果想用KB标示页面的大小可以用pagesize命令)。重复多次这个命令,如果发现任何动态分配内存的进程大小一直增长而没有缩小,就说明可能存在内存泄露。
命令提示: HP-UNIX 下查看swap使用:
swapinfo -at 输出如下:$ swapinfo -at
Kb Kb Kb PCT START/ Kb
TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
dev 33554432 0 33554432 0% 0 - 1 /dev/vg00/lvol2
dev 33554432 0 33554432 0% 0 - 1 /dev/vg00/swap2
reserve - 35817644 -35817644
memory 78162140 23476020 54686120 30%
total 145271004 59293664 85977340 41% - 0 -
具体解释,自己可以man下,反正我自己也不太理解。
$ ps -lu olcom
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME COMD
1 R 109 12945 12944 1 152 20 1ff855040 1218 - ? 0:12 xx-ls
1 S 109 12338 1 0 158 20 21f950e40 468 166c33040 ? 0:00 xx-c
1 R 109 18168 18167 0 152 20 171323200 1224 - ? 2:02 xx-l
1 S 109 2698 1 0 158 20 21ecbf4c0 433 16c139040 ? 0:00 xx-cd
1 R 109 12339 12338 0 152 20 1cafbc980 1976 - ? 6:17 xx-c
1 S 109 26219 1 0 158 20 16d052180 354 16dbb0040 ? 0:00 xx-cd
1 S 109 12944 1 0 158 20 21c817300 422 16df37040 ? 0:00 brsAps-ls
-----------------------------------------------------------------------------
AIX 命令:topas
/usr/sbin/swap -s
阅读(761) | 评论(0) | 转发(0) |