2010-12-10 11 views

cevap

1

Her statik değişken olursa olsun, bir referans türü veya bir değer türüne içinde bildirilen var olsun, yığın saklanır. sayısı kaç tane olursa olsun, toplamda tek bir yuva oluşturulur. (Bu bir yuva için örneğinin olması gerekmiyor olsa da, olması gerekir.) Bu yığının topluluğunun normal yığından toplanan yığından ayrı olduğunu unutmayın - "yüksek sıklık yığını" olarak bilinir ve uygulama alanı başına bir tane.

here'dan çalındı.

+0

Yani çöp toplayıcı statik değişkenlerle çalışmıyor? hafızadan nasıl atabiliriz? – Vikram

+0

Yani statik sınıf ve statik değişkenler veya yöntem arasındaki fark nedir? – Vikram

+2

Statik değişkenlerin tüm noktası, appdomain'in ömrü boyunca var olmalarıdır, bu nedenle tanım olarak asla çöp toplanmayacaklardır - en azından appdomain/process çıkana kadar değil. Statik sınıflar, statik yöntemler ve statik değişkenler arasındaki farklar tamamen farklıdır ve fark C# 101'dir.Statik değişkenler "sınıf düzeyi" dir - değişkenin bir örneği appdomain boyunca oluşturulduğu sınıfın içine göre oluşturuldu. Statik yöntemler, bir örnekte çağrılması gerekmeyen bir sınıftaki yöntemlerdir - temelde küresel işlevler. –

7

Yüksek frekans yığını, türlerin yöntem tablosu gibi yaygın olarak kullanılan iç veri yapılarını depolamak için kullanılır. Bu, aşağıda gösterildiği gibi WinDbg/SOS kullanılarak doğrulanabilir.

SSCLI book (p. 235) de belirtilmiştir.

İşte !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. 

Bildirimi yüksek frekanslı yığın konumu ve çöp toplanan yığınları için çıkış parçası. İşte, Program statik olarak ayrılmış bir örneği için !dumpobject için çıktı.

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 

Bildirim tip Program statik referans p için adresi. Toplanan çöp yığınındaki bir adrese işaret eder. Ayrıca, Yöntem Tablosunun adresini de dikkate alın. Yüksek frekans yığınındaki bir adrese işaret eder.

1

Bu excellent MSDN article on .Net runtime internals numaralı belgede, yüksek frekans yığınının bir örnek olduğu çeşitli "yükleyici yığınları" ile ilgili iyi bir genel bakış vardır. Bu makaleden

: MethodTables gibi

Sık sık erişilen eserler, MethodDescs, FieldDescs ve Arayüz Maps, bir HighFrequencyHeap üzerinde ayrılacağını böyle EEClass ve ClassLoader ve arama tabloları gibi daha az sık erişilen veri yapıları, olurken, bir LowFrequencyHeap tahsis edilir. StubHeap, kod erişim güvenliğini (CAS), COM sarmalayıcı çağrılarını ve P/Invoke özelliğini kolaylaştıran taslakları barındırır.

+0

Bağlantı bozuk: - \ – Vlad

+0

Ugh, neden makale URL'lerini neden işlenmesi gerektiği gibi kalıcı kaynak olarak ele alabilir. Hiç öğrenecekler mi? İnternet Arşivi'ne teşekkürler. Lütfen bir bağış düşünün! www.archive.org – codekaizen

+1

Veya belki [bu] (http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazineMay2005en-us.chm) (uyarı:. içinde chm). – Vlad

-3

Yüksek frekans yığınının noktası, sık sık erişilecek nesnelerin birbirine yakın şekilde depolanmasıdır. Bu işlemin çalışma setini en aza indirir.

+0

Bu gerçekten CLR açısından doğru gelmiyor, yine de. – codekaizen

+0

codekaizen: Hangi kısmı doğru gelmiyor? – Gabe

İlgili konular