OutOfMemoryException, размер файла дампа и размер кучи GC - PullRequest
0 голосов
/ 28 сентября 2011

32-разрядное .net-приложение, запущенное на 32-разрядной машине, столкнулось с OutOfMemoryException. Затем я сделал полный дамп памяти, и хотя с помощью WinDbg я могу убедиться, что используется много памяти, мне интересно, почему мы получаем OOMEs, хотя размер кучи GC, согласно выводу WinDbg для "! Eeheap -gc", равен только около 1 ГБ, поэтому похоже, что до 1,5 ГБ .net осталось достаточно места.

Вот части вывода:

0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x6a12ffcc
generation 1 starts at 0x6a12ffc0
generation 2 starts at 0x016a1000
ephemeral segment allocation context: (0x6a12ffd8, 0x6a12ffe4)
 segment    begin allocated     size
016a0000 016a1000  0269ff64 0x00ffef64(16772964)
...

69130000 69131000  6a12ffd8 0x00ffefd8(16773080)
Large object heap starts at 0x026a1000
 segment    begin allocated     size
026a0000 026a1000  03698a98 0x00ff7a98(16743064)
...

70020000 70021000  70a7d750 0x00a5c750(10864464)
Total Size  0x3c67abb4(1013427124)
------------------------------
GC Heap Size  0x3c67abb4(1013427124)

Ожидается ли это? Где будут остальные ~ 500 МБ?

Некоторые подробности:

  • Размер самого файла дампа составляет 2.007.000.476 байт.
  • Машина, на которой было запущено программное обеспечение, имела только 1 ГБ физической ОЗУ, но виртуальная память этой машины была настроена на увеличение до 3 ГБ (так что приложение должно иметь возможность увеличивать до 1,5 ГБ максимум до 32 бит). сетевые приложения).

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Скорее всего, процесс не поддерживает 3 ГБ. Это настройка для процесса.

Также, если вы хотите увидеть общее использование памяти, вы можете использовать! Heap -s. Это даст вам краткую информацию о том, что делает каждая куча и объем используемой памяти. Это также покажет вам проблемы фрагментации. Объедините это с управляемой кучей, и это должно дать вам представление об общем использовании памяти.

0 голосов
/ 03 октября 2011

Размер дампа почти 2 Гб означает, что пространство адресов пользователя процесса заполнено.Память заполняется не только выделением памяти .Net, но также и выделением собственных (C / C ++), объединенным кодом, двоичными файлами, стеками ... С помощью Windbg проверьте использование виртуального пространства с помощью! Address -summary.Чтобы получить глобальное представление, вы также можете использовать DebugDiag для анализа дампа.

...