Почему виртуальная память всегда увеличивается, а не уменьшается

Я поддерживаю большую систему (очень очень большую) и обнаружил проблему с памятью.
Эта система представляет собой один 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

0

Решение

Я не уверен, поможет ли это, но у меня были похожие проблемы с памятью при работе приложения с интенсивным использованием памяти под Windows XP. Насколько я помню, проблема заключалась в фрагментации памяти, которая была вызвана большим количеством небольших выделенных / удаленных распределений контейнера stl. Поэтому, если ваше приложение выполняет много небольших выделений / выделений, я бы предложил зарезервировать память и использовать ее повторно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]