应用程序未使用太多内存,为什么会出现System.OutOfMemoryException异常?

4
我遇到了这个错误,但无法弄清楚为什么会出现。
我使用的是Windows 8.1 64位操作系统,拥有32 GB的内存。应用程序是32位的,在任务管理器中只占用约400 MB的内存,使用GC.GetTotalMemory(false)检查时甚至更少。
如何调试此错误的原因?
该应用程序使用C# wpf .net 4.5编写。
以下是数据库中最大的压缩字符串数据(322 KB):http://www.monstermmorpg.com/reciprocal/zipped.txt 以下是该最大数据的未压缩字符串(4837 KB):http://www.monstermmorpg.com/reciprocal/unzipped.txt 以下是解压缩字符串函数。
private static string Un_GZip_String(string compressedText)
{     
        using (var memoryStream = new MemoryStream())
        {
            byte[] gZipBuffer = Convert.FromBase64String(compressedText);
            int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
            memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);

            var buffer = new byte[dataLength];

            memoryStream.Position = 0;
            using (var gZipStream = new GZipStream(memoryStream, System.IO.Compression.CompressionMode.Decompress))
            {
                gZipStream.Read(buffer, 0, buffer.Length);
            }

            return Encoding.UTF8.GetString(buffer);
        }
}

http://i.stack.imgur.com/fepMs.png

enter image description here


1
你可以从以 base64 编码的数据中获取前 4 个字节的 dataLength,并盲目地使用它。也许你应该检查一下是否存在损坏的值?例如,这可能是大端序和小端序的问题。 - RenniePet
1
确实,逐步检查所有参数/变量。 也许在代码中进行较小的步骤,进行合理性检查和跟踪/调试。 此外,将Html存储到临时文件中并在加载后删除它,以查看它在哪些文件上崩溃。 然后尝试在该文件上使用hdMyDoc.LoadHTML。您可能已经发现了一个错误。 - Pieter21
@Pieter21 这种情况是随机发生的,因此无法跟踪。此外,这里数据库中最大的压缩字符串数据长度为329712个字符:http://pastebin.com/wKRwsZ0F - Furkan Gözükara
6
这里的问题不在于RAM的数量。您说这是一个32位进程,因此地址空间限制为2 GB,无论盒子上有多少可用的RAM。这可能与碎片有关,但如果您在进程级别仅使用了400 MB,则听起来很奇怪,您会看到OOM。 - Brian Rasmussen
2
可能是大对象堆碎片问题。请参阅http://support.microsoft.com/kb/2020006。 - phoog
显示剩余20条评论
1个回答

0

我尝试了微软的Visual Studio性能分析器,但它也无法胜任。因为有太多的对象被创建和处理,每秒大约有成千上万个对象。 - Furkan Gözükara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接