引发类型为“System.OutOfMemoryException”的异常

在运维工作中,经常能接到客户的反馈这个:引发类型为“System.OutOfMemoryException”的异常。客户反馈物理内存都还有富余,怎么报内存不足的错误呢!

什么时候会引发System.OutOfMemoryException:操作系统无法满足GC对连续内存块的请求,则会发生System.OutOfMemoryException

可能原因
1:内存真的不够了,连虚拟内存都用完了。
2:内存还有,但碎片化严重,无法找到合适的连续内存块。

一些常见的原因
1、系统里缓存了大量的数据,没有及时释放。应该控制缓存的数据大小,缓存失效的时间。
2、操作的大数据的文件或者DataTable。应该分块读取。
3、本地资源泄漏。
解决方案:
3.1 应该及时释放本地资源
3.2 使用IDisposable模式

4、大量的对象被固定,不能被压缩移动,导致内存产生大量碎片。
解决方案:

4.1 如果固定对象大约在同一时间分配,则每两个对象之间的碎片更小
4.2 优先初始化,因为较旧的对象位于堆的底部,但大多数可用空间都是在堆顶部生成的。
4.3 固定对象的时间越短,GC就越容易压缩堆
在这里插入图片描述


版权声明:本文为qq118034951原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。