Высокочастотная куча

Может кто-нибудь объяснить мне "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.

Суть высокочастотной кучи заключается в том, что объекты, к которым часто обращаются, хранятся близко друг к другу. Это минимизирует рабочий набор процесса.

Другие вопросы по тегам