.net - 带有 system.OutOfMemoryException 的 x86 .net 应用程序

标签 .net out-of-memory

应用程序运行 1 天后出现 OutOfMemoryException,该应用程序总共使用了 1.5G 内存,全部由托管堆消耗,第 2 代使用了 200mb ,LOB 使用了 1.3mb ,但奇怪的是,900mb 的空间是免费的。从 perf counter 我看到发生了很多 gen 2 gc 收集,为什么 GC 收集器无法收集 gen2 和 LOB 中的 900mb 可用空间?

非常感谢您的帮助。

以下信息来自windbg:

0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x183153f0
generation 1 starts at 0x182aa834
generation 2 starts at 0x02131000
ephemeral segment allocation context: none
 segment     begin allocated  size
02130000  02131000  0312f284  0xffe284(16769668)
07750000  07751000  0874fc5c  0xffec5c(16772188)
09e30000  09e31000  0ae2fc2c  0xffec2c(16772140)
0b230000  0b231000  0c22ffec  0xffefec(16773100)
0c230000  0c231000  0d22f6f0  0xffe6f0(16770800)
0d230000  0d231000  0e22ea10  0xffda10(16767504)
0e230000  0e231000  0f22c1c4  0xffb1c4(16757188)
10390000  10391000  1138ddf4  0xffcdf4(16764404)
154e0000  154e1000  164da90c  0xff990c(16750860)
34aa0000  34aa1000  35a9dbfc  0xffcbfc(16763900)
7aca0000  7aca1000  7bc9edfc  0xffddfc(16768508)
49760000  49761000  4a75ef64  0xffdf64(16768868)
7bca0000  7bca1000  7cc99bac  0xff8bac(16747436)
17a70000  17a71000  183313fc  0x8c03fc(9176060)
Large object heap starts at 0x03131000
 segment     begin allocated  size
03130000  03131000  041250c8  0xff40c8(16728264)
08920000  08921000  099102f8  0xfef2f8(16708344)
....
....
4c760000  4c761000  4d71d578  0xfbc578(16500088)
1bb10000  1bb11000  1ca110d0  0xf000d0(15728848)
57760000  57761000  5862d7f8  0xecc7f8(15517688)
Total Size:              Size: 0x5ab13450 (1521562704) bytes.
------------------------------
GC Heap Size:            Size: 0x5ab13450 (1521562704) bytes.
0:000> !dumpheap -stat
total 0 objects
Statistics:
      MT    Count    TotalSize Class Name
73037c78        1           12 System.Configuration.GenericEnumConverter
73036da0        1           12 System.Configuration.InfiniteIntConverter
....
....
69161c3c    35025      6809420 System.Windows.EffectiveValueEntry[]
69164748       54     12471072 MS.Internal.WeakEventTable+EventKey[]
710e2228     9540    190389260 System.Byte[]
710dd2b8  1317031    339257932 System.String
0035a670     6427    902224056      Free
Total 3615631 objects

最佳答案

如果您要使用 WinDBG/SOS,那么就学习使用它;)Tess Ferrandez 关于此主题的许多帖子都是宝贵的资源。

使用 !dumpheap -stat 收集消耗堆的对象类型(和数量)的统计信息。

使用 !dumpheap -min 查找至少字节大的对象。

使用 !dumpheap 来识别当前位于堆中的对象。

使用 !gcroot 帮助找到任何使您认为已死亡的对象保持活力的根。

如果没有有关您的应用和场景的一些详细信息,就很难进一步诊断。一些提示:

看看你是否有包含很多东西的静态容器或静态对象。请记住 - 静态对象在应用程序的生命周期内存在。因此,静态容器在应用程序的整个生命周期中都存在,如果它们引用了应该被删除的对象,那么这些对象将继续存在。

另请注意,您的应用很可能会消耗大量 RAM,因为可能有大量空闲 RAM,因此不值得花费收集和压缩 LOH 的成本。

这也可能被证明是非常有值(value)的: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

关于.net - 带有 system.OutOfMemoryException 的 x86 .net 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694758/

相关文章:

c# - 以编程方式解锁 applicationHost.config 中的部分

c# - 得到一个整数?从数据库使用 DbDataReader

.net - 如何强制针对 .NET Framework 4 编译的应用程序在 .NET Framework 4.6.1 下运行?

android - 在 Android 中显示来自服务器字节数组的图像

objective-c - iPhone - 程序接收信号 : 0 - on device but not on simulator ( Memory MAnagement Issue)

c# - 我可以对具有物理访问权限的管理用户隐藏 .NET 内存变量吗?

c# - 我如何将这个谓词定义为一个函数?

opencv - opencv内存不足错误

java - 如何安全地读取可能是二进制的文本文件?

Java - 字节缓冲区内存不足