高频堆

Vik*_*ram 11 .net c#

谁能解释一下CLR的"HighFrequencyHeap"?

Bri*_*sen 8

高频堆用于存储常用的内部数据结构,例如类型的方法表.这可以使用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.
Run Code Online (Sandbox Code Playgroud)

注意高频堆的位置和垃圾收集堆.这!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
Run Code Online (Sandbox Code Playgroud)

注意p类型中静态引用的地址Program.它指向垃圾收集堆中的地址.另外,请注意方法表的地址.它指向高频堆中的地址.


Abe*_*ler 2

每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明。无论创建多少个实例,总共只有一个槽位。(不过,不需要为该插槽的存在创建任何实例。)请注意,该堆与正常的垃圾收集堆是分开的 - 它被称为“高频堆”,每个应用程序域都有一个。

这里偷来的。

  • 静态变量的全部要点是它们在应用程序域的生命周期内存在,因此根据定义它们永远不会被垃圾收集 - 至少在应用程序域/进程退出之前不会。至于静态类、静态方法和静态变量之间的区别,它们是完全不同的,区别是 C# 101。 静态变量是“类级别” - 跨应用程序域创建变量的一个实例,范围根据类静态方法是类中不需要在实例上调用的方法 - 它们基本上是全局函数。 (2认同)