Я поддерживаю большую систему (очень очень большую) и обнаружил проблему с памятью.
Эта система представляет собой один EXE-файл с большим количеством библиотек DLL, написанных на C ++, собранных с VS2008 и работающих на WinXP.
Я использую Process Explorer (sysinternals) для наблюдения за использованием памяти.
Я считаю, что разрыв между виртуальной памятью (VM) и частными байтами (PB) становится все больше и больше.
Сначала виртуальная машина немного больше, чем PB, а затем VM и PB быстро увеличиваются с работой.
В некоторый момент PB уменьшается, но VM не уменьшается. VM может стать на 300 МБ больше, чем PB.
Я нахожу, что ВМ всегда увеличивается, а ПБ увеличивается, а затем уменьшается, наконец, ВМ составляет почти 2 ГБ, и система падает.
В моей системе нет прямых вызовов каких-либо функций выделения виртуальной памяти, таких как VirtualAlloc / VirtualAllocEx, просто используйте new / delete / malloc / free / HeapCreate / HeapAlloc для использования памяти.
Я использую windbg для его отладки и использую! Heap -s для отображения сводки кучи процесса, и нахожу, что эта куча зарезервировала более 300 МБ памяти, но просто фиксирую 15 МБ.
В этом выводе я также нашел некоторые исключения,
Virtual address fragmentation -1340964299% (191 uncommited ranges)
ERROR Cannot read SubSegmentZones list at 79858461
Кто-нибудь знает, почему ВМ всегда увеличивается?
Заранее спасибо.
Ниже приводится часть вывода! Heap -s 00170000
!heap -s 00170000
Walking the heap 00170000 ...Verbose mode ON.
.......Virtual block: 26740000 - 26740000 (size 00000000)
Virtual block: 267f0000 - 267f0000 (size 00000000)
0: Heap 00170000
Flags 00000002 - HEAP_GROWABLE
Reserved memory in segments 327680 (k)
Commited memory in segments 15548 (k)
Virtual bytes (correction for large UCR) 884 (k)
Free space 5818 (k) (320 blocks)
External fragmentation 37% (320 free blocks)
Virtual address fragmentation -1340964299% (191 uncommited ranges)
Virtual blocks 2 - total 0 KBytes
Lock contention 4
Segments 10
0 hash table for the free list
Commits 0
Decommitts 0
Low fragmentation heap 15a3c9e0
ERROR Cannot read SubSegmentZones list at 79858461
Metadata usage 3072 bytes
Statistics:
Segments created 0
Segments deleted 0
Segments reused 0
Я не уверен, поможет ли это, но у меня были похожие проблемы с памятью при работе приложения с интенсивным использованием памяти под Windows XP. Насколько я помню, проблема заключалась в фрагментации памяти, которая была вызвана большим количеством небольших выделенных / удаленных распределений контейнера stl. Поэтому, если ваше приложение выполняет много небольших выделений / выделений, я бы предложил зарезервировать память и использовать ее повторно.
Других решений пока нет …