32-битное приложение .net, работающее на 32-битной машине, столкнулось с OutOfMemoryException. Затем я сделал полный дамп памяти, и хотя с помощью WinDbg я могу убедиться, что используется много памяти, мне интересно, почему мы получаем OOME, хотя размер кучи 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-битных приложений .net) .