记录一次项目中内存泄漏分析

一、背景

最近发现服务器64G内存被占用92%,查看内存使用情况发现程序占用了16G,当即重启项目后内存恢复正常,但一天后内存又涨到9G,这才意识到可能存在内存泄漏问题。

二、WinDbg 分析

由于使用的是windows服务器使用的IIS托管,打开任务管理器后找到对应项目的进程右键创建转存储文件(DMP 文件)。
2024-04-18T07:13:07.png
使用WinDbg打开dmp文件使用 !address -summary 命令,我们可以看到commit占用了5.1G
2024-04-18T07:30:21.png
在使用 !eeheap -gc 命令我们可以看到commit占用4.8G,我们实际只占用了4.7G的内存。
2024-04-18T07:32:03.png
接下来我们来看看4.7G内存这块,直接!dumpheap -stat 命令查看托管就好了
2024-04-18T07:38:14.png
可以看到都是byte[]占用内存,接下来我们到项目中搜一使用到字节数组的地方
2024-04-18T07:39:40.png
2024-04-18T07:39:56.png
我们可以看到使用到byte[]的地方都有用到static关键字,虽然byte[]是托管类型,会被GC垃圾回收,但是因为static关键字他不会GC释放,这样就会造成内存泄漏。

至此本此内存泄漏分析完毕,如有错误的地方欢迎指出,共同进步。