保留的内存可能导致Out of memory异常

Mic*_*ael 8 .net memory memory-management windbg out-of-memory

我们有一个泄漏内存的32位Windows服务 - 抛出OutOfMemory异常.它是在Windows Server 2003上运行的.net 4.0可执行文件.在使用WinDbg调试崩溃转储文件时,我看到大部分内存实际上是保留的而不是提交的. 在此输入图像描述

从WinDbg屏幕截图中可以看出,存在2.5 Gb的未分类内存使用情况,其中大部分2.1 Gb实际上是保留内存(MEM_RESERVE).我有调试压缩转储的经验,但这种情况对我来说是新的.MEM_COMMIT退出OK - 564.270 Mb,托管堆的大小为82 Mb

在此输入图像描述

我还查看了原生堆,看看是否保留了大块数据,但也找不到任何可疑的东西

在此输入图像描述

所以我的问题是 - MEM_RESERVED可能导致OOM异常吗?如果是这样,我该如何调试它,看看为什么/如何保留大量的内存?你还能在哪里找到可能存在的问题?

如果需要任何其他信息,请索取,我将更新我的帖子.

Bri*_*sen 6

是的,保留记忆可以触发OutOfMemoryException.尝试分配几个非常大的字节数组.在写入数组内容之前,不会提交这些内存.但是,您可以通过分配这些数组轻松触发OOM.

我不知道实现细节,但是因为VirtualAlloc如果不能遵守保留请求就会失败,我假设CLR将其转换为异常.我没有看到它如何将失败的预留请求变成任何有用的东西,所以异常是一个明智的选择.