2009-09-28 3 views
2

Сначала я понимаю, что утечки могут плохо фрагментировать память, но, пожалуйста, несите меня.Скажите, скажите знак фрагментации памяти (в отличие от утечки памяти)?

  • Использование WinDbg и присоединение к процессу: Использование кучи (или другую команду WinDbg), что я должен ожидать увидеть, если я имею дело с фрагментацией памяти, в отличие от утечки? Например, я могу использовать «! Heap stat» и «! Heap stat -h handle» до нуля в коде, генерирующем утечку; но есть ли что-то в этих же возвратных значениях, которые намекают на фрагментацию?
  • Распределение памяти радикально изменилось между XP и Vista? В частности, что связано с DLL и другой загрузкой библиотеки? Мы развиваемся исключительно на XP, поэтому я незнаком с Vista, но выясняется, что некоторые проблемы памяти, которые мы наблюдали на XP, исчезают, когда мы устанавливаем одни и те же файлы в Vista.

Спасибо!

ответ

2

Прошу прощения, я не могу помочь вам с проблемой фрагментации, поэтому я собираюсь обратиться к вашему второму вопросу.

Vista представила ASLR, которая изменяет способ загрузки DLL. Для получения дополнительной информации см. Это wiki entry и для более конкретного обсуждения this post может быть полезно.

2

Начиная с Windows Vista, новый менеджер памяти включен по умолчанию, называемый кучей фрагментации (m2).

MS Description

Для Windows XP вы можете включить низкую фрагментации кучи, используя следующий код:

HANDLE heaps[1025]; 
DWORD nheaps = GetProcessHeaps((sizeof(heaps)/sizeof(HANDLE)) - 1, heaps); 
for (DWORD i = 0; i < nheaps; ++i) { 
    ULONG enableLFH = 2; 
    HeapSetInformation(heaps[i], HeapCompatibilityInformation, &enableLFH, sizeof(enableLFH)); 
} 
9

Есть несколько различных видов фрагментации: адресного пространства фрагментации и фрагментации кучи. Первые могут привести к сбоям в развертывании управляемых или неуправляемых кучей или сбоях в загрузке DLL, последняя может привести к сбоям в распределении памяти при вызовах new.

Чтобы получить обзор адресного пространства, вы можете использовать !address -summary. Это говорит о том, сколько свободного места, совершенное, используется для сопоставления DLL, дескрипторов виртуальных адресов (метаданных) и т. Д. Инструмент sysinternals VMMap дает вам графическое представление, без необходимости отладки.

Для фрагментации кучи, выход из !heap -s должен включать в себя некоторое представление о том, как фрагментирован неуправляемых отвалы, например .:

00970000 00001002 64576 39232 49736 5732 1314 448 0  1 L 
    External fragmentation 14 % (1314 free blocks) 
    Virtual address fragmentation 21 % (448 uncommited ranges) 

Вы можете вырыть в это с помощью !heap -stat, например, !heap -stat -h 00970000, учитывая приведенный выше результат, и это скажет вам распределение размеров размещения и т. Д. Это может быть полезно, если у вас есть большое количество мелких объектов, если вы не используете кучу фрагментации, например:

0:057> !heap -stat -h 00970000 
heap @ 00970000 
group-by: TOTSIZE max-display: 20 
    size  #blocks  total  (%) (percent of total busy bytes) 
    134 c0c8 - e7f0a0 (50.72) 
    18 ee22 - 165330 (4.88) 
    8c 26f9 - 15502c (4.66) 
    a4 1ffc - 147d70 (4.48) 

Надеюсь, это поможет.

+1

Стоит отметить, что вы можете подтвердить, что куча низкой фрагментации включена, проверяя тот же вывод из '! Heap -s'. «L» в конце строки будет изменен на «LFH», если включена куска с низкой фрагментацией. – IvyMike

+0

В первом абзаце вы случайно отменили использование «бывших» и «последних»?«Я бы подумал, что фрагментация адресного пространства приведет к сбоям в распределении памяти с« новым », а фрагментация кучи приведет к сбоям расширения кучи. –

Смежные вопросы