在一次项目(项目A)上线后,发现很多服务随着调用量上升,占用系统内存越来越大,导致系统内存不足,需重启应用才能正常运行,但同样的程序在另一项目(项目B)实施时却并没有出现该问题。
分析两工程项目源码完全一致,只是运行操作系统不一致:项目B为sun solaris,项目A为IBM AIX系统;查找源码中调用次数多的公共函数,后发现在一个公共函数中调用了函数opendir,使用完后未调用closedir函数,会导致内存泄露。
修改程序,上线部署,监控运行情况,确认系统内存占用恢复正常,问题得以解决。
在多次项目实施过程中,常发生程序内存泄露的情况,总结主要有以下几种类型(unix C环境):
1、动态分配(malloc)堆内存,未释放(free);
2、fopen打开文件,未关闭(fclose);
3、打开sql游标后未关闭;
4、打开一个目录(opendir),未关闭(closedir)
还有一种隐藏的问题是,程序中申请内存后,虽然写了对应的内存释放语句,但程序在执行到内存释放语句之前有可能已经异常退出,还是会导致程序内存泄露,这种情况较难定位。