.NET内存故障排除

时间:2010-06-06 18:40:57

标签: c# .net memory-management out-of-memory

在阅读了一些有关.NET技术内存的启发性文章后,Out of Memory does not refer to physical memory597499

我以为我理解为什么C#应用程序会抛出一个内存不足的异常 - 直到我开始尝试使用两台服务器 - 两者都有2.5 GB的ram,windows server 2003和相同的程序运行。

两者之间唯一显着的区别是剩下7%的硬盘存储空间而另一个存在超过50%。

剩余7%存储空间的服务器始终会丢失内存,而另一台服务器的性能始终如此。

我的应用程序是一个C#Web应用程序,它处理'数百MB的String对象。

为什么会发生这种差异,因为内存不足问题的最可能原因是连续的虚拟地址空间。

6 个答案:

答案 0 :(得分:8)

我能想到的是,你正在耗尽虚拟内存。听起来你需要在应用程序上运行内存分析器。

我过去曾在类似情况下使用Red Gate profiler。你可能会对你的字符串实际使用的内存感到惊讶。

答案 1 :(得分:3)

每台计算机上的页面文件碎片是否不同?高度碎片可能会减慢分页操作,从而加剧内存问题。如果页面文件被大量分段,请将其排序,例如使服务器脱机,将页面文件大小设置为零,对驱动器进行碎片整理,重新创建页面文件。

很难就如何处理字符串处理中的perf问题提出任何具体建议,而没有更详细的信息。

答案 2 :(得分:3)

  

为什么会出现这种差异   看到最可能的原因   内存不足问题就出局了   连续的虚拟地址空间?

使用7%的可用硬盘,您的服务器可能没有足够的空间来从您的进程或其他进程中分页内存,因此它必须将所有内容保留在RAM中,因此您无法更频繁地分配额外的内存。服务器有50%的可用空间。

  

你们提出什么解决方案?

由于您已经运行了一个分析器,并且看到所有字符串数据至少有600MB以上的使用率,您需要开始解决此问题。

显而易见的答案是不将所有数据保存在内存中。如果您正在处理一个大型数据集,那么加载一下,处理它然后将该位丢弃并加载下一位而不是预先加载它。

如果需要提供数据,请查看LRU(最近最少使用)等缓存策略,并将最热门的数据保留在内存中,但将其余数据保留在磁盘上。

您甚至可以将字符串卸载到数据库(内存或基于磁盘)中,并让它为您处理缓存管理。

我过去不得不使用的一个稍微离场的解决方案就是在内存中压缩字符串数据,并在需要时使用SharpZipLib再次解压缩。这并不是那么令人惊讶。

答案 3 :(得分:0)

我同意你最好的选择是使用内存分析器。我已经使用了.Net Memory Profiler 3.5并且能够诊断出这个问题,在我的例子中,这个问题是无用的正则表达式。他们有demo tutorials,如果你不熟悉的话会引导你完成整个过程。

正如您的问题,对字符串的任何单个引用(例如锯齿状数组)仍然会阻止字符串的处理。如果不了解您的架构,就很难做出具体的建议。我会建议尝试优化您的应用程序,然后扩展内存。它会在稍后回来咬你。

答案 4 :(得分:0)

OutOfMemoryException更有可能表示您的页面文件中存在碎片 - 而不是您的RAM或磁盘空间不足。

通常(错误地)假设页面文件用作交换磁盘 - 将RAM溢出写入页面文件。 所有分配的内存都存储在页面文件中,只有大量使用的数据才会被复制到RAM中。

除了尝试减少应用程序的内存占用空间之外,没有简单的代码修复此问题。但是,如果你真的绝望,你可以尝试PageDefrag,这是一个最初由SysInternals开发的免费应用程序。

答案 5 :(得分:0)

增加内存有一些技巧(我不知道它是否适用于网络应用程序,但看起来确实如此):

“内存不足?增加程序可用内存的简单方法” http://blogs.msdn.com/b/calvin_hsia/archive/2010/09/27/10068359.aspx