2014-01-23 2 views
6

Я использую windbg для отладки памяти на Win7.Внешняя фрагментация и фрагментация виртуальных адресов в windbg

Я использую кучи и получил следующий выход.

0:002> !heap -s 
LFH Key     : 0x6573276f 
Termination on corruption : ENABLED 
    Heap  Flags Reserv Commit Virt Free List UCR Virt Lock Fast 
        (k)  (k) (k)  (k) length  blocks cont. heap 
----------------------------------------------------------------------------- 
000f0000 00000002 1024 552 1024 257  7  1 0  0 LFH 
00010000 00008000  64  4  64  2  1  1 0  0  
00330000 00001002 1088 160 1088  5  2  2 0  0 LFH 
00460000 00001002  256  4 256  2  1  1 0  0  
012c0000 00001002 1088 408 1088  8 10  2 0  0 LFH 
00440000 00001002 1088 188 1088  24  9  2 0  0 LFH 
01990000 00001002 1088 188 1088  24  9  2 0  0 LFH 
00420000 00001002 1088 152 1088  5  2  2 0  0 LFH 
01d20000 00001002  64  12  64  3  2  1 0  0  
01c80000 00001002  64  12  64  1  2  1 0  0  
012e0000 00001002 776448 118128 776448 109939 746 532 0  0 LFH 
    External fragmentation 93 % (746 free blocks) 
    Virtual address fragmentation 84 % (532 uncommited ranges) 
01900000 00001002  256  4 256  1  1  1 0  0  
01fa0000 00001002  256 108 256  58  3  1 0  0  
01c40000 00001002  64  16  64  4  1  1 0  0  
03140000 00001002  64  12  64  3  2  1 0  0  
33f40000 00001002  64  4  64  2  1  1 0  0  
340f0000 00001002 1088 164 1088  3  5  2 0  0 LFH 
----------------------------------------------------------------------------- 

Мой вопрос: что является внешняя фрагментация и что такое виртуальная фрагментация addess? А что означает 93% и 84%?

Заранее спасибо.

+0

Есть ли здесь знакомые с этим? –

ответ

5

Результат WinDbg относится к куче перед номерами фрагментации, в вашем случае куча 012e0000.

External fragmentation = 1 - (larget free block/total free size) 

Это означает, что самый большой свободный блок в этой куче 7.63 MB, хотя общий свободный размер составляет 109 МБ. Обычно это означает, что вы не можете выделить более 7,63 МБ в эту кучу сразу.

Подробное описание внешней фрагментации см. Также Wikipedia.

Virtual address fragmentation: 1 - (commit size/virtual size) 

В то время как я не нашел хорошее объяснение фрагментации виртуальной памяти, это интерпретация формулы: виртуальный размер общий объем доступной памяти. Размер Commit - это то, что используется. Разность (1 - x) непригодна для использования.

Вы можете перейти к более подробной информации о этой куче, используя !heap -f -stat -h <heap> (!heap -f -stat -h 012e0000 в вашем случае).

+0

Благодарим вас за ответ. –

+0

Не могли бы вы объяснить, как вы знаете, что самый большой бесплатный блок - 7,63 МБ? А что означает виртуальный размер? В моем случае Virt всегда равен Резерву. –

+0

@KevinTian: Самый большой свободный блок можно вычислить, разрешив формулу для наибольшего свободного блока. 'Самый большой свободный блок = (1 - внешняя фрагментация) * полный свободный размер'. –

0

Если вы пытаетесь отладить проблему фрагментации памяти, вы должны взглянуть на VMMAP из sysinternals.

http://technet.microsoft.com/en-us/sysinternals/dd535533

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

0

Благодарим ответ Стаса Ш.

Я использую VMMap для анализа памяти, используемой процессом.

Но я смущаюсь с личными данными, отображаемыми в VMMap.

Я пишу демо-приложение и использую HeapCreate для создания частной кучи, а затем выделяем много маленьких блоков из этой кучи HeapAlloc.

Я использую VMMap для анализа этого демонстрационного приложения, а последующая информация - из VMMap.

Process: HeapOS.exe 
PID: 2320 

Type   Size  Committed Private Total WS Private WS Shareable WS Shared WS Locked WS Blocks Largest 
Total  928,388  806,452 779,360 782,544 779,144  3,400   2,720     188  
Heap   1,600  500  488  460  452   8    8      13  1,024 
Private Data 888,224  774,016 774,016 774,016 774,012  4    4      24  294,912 

Я нашел Кучу очень маленькую, но личные данные очень большие.

Но с Помощью VMMap, он пояснил, что

Private 

Private memory is memory allocated by VirtualAlloc and not suballocated either by the Heap Manager or the .NET run time. 
It cannot be shared with other processes, is charged against the system commit limit, and typically contains application data. 

Так что я думаю, что личные данные памяти располагают VirtualAlloc из виртуального адресного пространства процесса, и просто не может использоваться совместно с другими процессами.Частные данные могут выделяться с помощью кода приложения, или с помощью диспетчера кучи ОС или среды выполнения .NET.

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