Высокочастотная куча
Может кто-нибудь объяснить мне "HighFrequencyHeap" CLR?
4 ответа
Высокочастотная куча используется для хранения часто используемых внутренних структур данных, таких как таблица типов методов. Это можно проверить с помощью WinDbg/SOS, как показано ниже.
Об этом также говорится в книге SSCLI (стр. 235).
Вот часть вывода для !eeheap
--------------------------------------
Domain 1: 006428c0
LowFrequencyHeap: 00340000(2000:2000) Size: 0x2000 (8192) bytes.
HighFrequencyHeap: 00342000(8000:2000) Size: 0x2000 (8192) bytes.
StubHeap: Size: 0x0 (0) bytes.
Virtual Call Stub Heap:
IndcellHeap: Size: 0x0 (0) bytes.
LookupHeap: Size: 0x0 (0) bytes.
ResolveHeap: Size: 0x0 (0) bytes.
DispatchHeap: Size: 0x0 (0) bytes.
CacheEntryHeap: Size: 0x0 (0) bytes.
Total size: Size: 0x4000 (16384) bytes.
--------------------------------------
Jit code heap:
LoaderCodeHeap: 004e0000(10000:1000) Size: 0x1000 (4096) bytes.
Total size: Size: 0x1000 (4096) bytes.
--------------------------------------
Module Thunk heaps:
Module 5ef21000: Size: 0x0 (0) bytes.
Module 00342e9c: Size: 0x0 (0) bytes.
Total size: Size: 0x0 (0) bytes.
--------------------------------------
Module Lookup Table heaps:
Module 5ef21000: Size: 0x0 (0) bytes.
Module 00342e9c: Size: 0x0 (0) bytes.
Total size: Size: 0x0 (0) bytes.
--------------------------------------
Total LoaderHeap size: Size: 0x13000 (77824) bytes.
=======================================
Number of GC Heaps: 1
generation 0 starts at 0x02521018
generation 1 starts at 0x0252100c
generation 2 starts at 0x02521000
ephemeral segment allocation context: none
segment begin allocated size
02520000 02521000 0252e010 0xd010(53264)
Large object heap starts at 0x03521000
segment begin allocated size
03520000 03521000 03523250 0x2250(8784)
Total Size: Size: 0xf260 (62048) bytes.
------------------------------
GC Heap Size: Size: 0xf260 (62048) bytes.
Обратите внимание на расположение высокочастотной кучи и кучи мусора. Вот вывод для !dumpobject
для статически распределенного экземпляра Program
,
0:000> !dumpheap -type Program
Address MT Size
0252b630 00343858 12
total 0 objects
Statistics:
MT Count TotalSize Class Name
00343858 1 12 TestBench2010.Program
Total 1 objects
0:000> !do 0252b630
Name: TestBench2010.Program
MethodTable: 00343858
EEClass: 0034154c
Size: 12(0xc) bytes
File: C:\workspaces\TestBench2010\TestBench2010\bin\Debug\TestBench2010.exe
Fields:
MT Field Offset Type VT Attr Value Name
00343858 4000001 4 ...Bench2010.Program 0 static 0252b630 p
0:000> !dumpheap -type Program
Address MT Size
0252b630 00343858 12
total 0 objects
Statistics:
MT Count TotalSize Class Name
00343858 1 12 TestBench2010.Program
Total 1 objects
0:000> !do 0252b630
Name: TestBench2010.Program
MethodTable: 00343858
EEClass: 0034154c
Size: 12(0xc) bytes
File: C:\workspaces\TestBench2010\TestBench2010\bin\Debug\TestBench2010.exe
Fields:
MT Field Offset Type VT Attr Value Name
00343858 4000001 4 ...Bench2010.Program 0 static 0252b630 p
Обратите внимание на адрес для статической ссылки p
в типе Program
, Он указывает на адрес в куче мусора. Также обратите внимание на адрес таблицы методов. Он указывает на адрес в куче высоких частот.
Каждая статическая переменная хранится в куче, независимо от того, объявлена ли она в ссылочном типе или типе значения. Всего есть только один слот, независимо от того, сколько экземпляров создано. (Однако для того, чтобы существовал один слот, не нужно создавать никаких экземпляров.) Обратите внимание, что эта куча отделена от обычной кучи, собираемой мусором, - она называется "высокочастотной кучей" и существует по одному на домен приложения.
Украдена отсюда.
В этой превосходной статье MSDN, посвященной внутренним элементам среды выполнения.Net, есть хороший обзор различных "куч кучи загрузчиков", одним из примеров которых является высокочастотная куча.
Из этой статьи:
Часто используемые объекты, такие как MethodTables, MethodDescs, FieldDescs и Interface Maps, размещаются в HighFrequencyHeap, в то время как менее часто используемые структуры данных, такие как EEClass и ClassLoader и их таблицы поиска, размещаются в LowFrequencyHeap. StubHeap содержит заглушки, которые обеспечивают безопасность доступа к коду (CAS), вызовы оболочки COM и P/Invoke.
Суть высокочастотной кучи заключается в том, что объекты, к которым часто обращаются, хранятся близко друг к другу. Это минимизирует рабочий набор процесса.