2012-06-14 27 views
5
MyObject obj = new MyObject(); 

'Yeni' anahtar kelimenin yapıcıyı arayacağını ve nesnenin yönetilen yığında başlatılacağını biliyorum.MyObject nes = new MyObject() verdiğimde neler oluyor =)

Sorum şu: CLR aşağıdaki işlemleri yapıyor.

  1. Yukarıdaki satır CLR tarafından nasıl yürütülür?
  2. CLR tarafından nesne için nesne nasıl ayrılır?
  3. CLR nesnenin boyutunu nasıl belirler?
  4. Nesneye öbek için bellek ayırmak için alan yoksa CLR nasıl anlar?
+5

Daha iyi bir fikir edinmek için C# ile CLR'yi okumanızı öneriyorum - Jeffrey Richter – V4Vendetta

cevap

2

Bir başvuru türü oluşturulduğunda (sınıf, delege, arabirim, dize veya nesne), yığına ayrılır .. Net dört farklı yığına sahiptir: (gen0, gen1, gen2) (Küçük nesne Yığın) ve LOH (Büyük Nesne Yığını). 85k veya daha küçük olan her şey, yaratma zamanına bağlı olarak (ilkden gen1'den gen1'e, gen2'ye, vs.) bağlı olarak, ilk üç yığından birine girer. 85k'den büyük nesneler LOH'ye yerleştirilir. LOH hiçbir zaman sıkıştırılmamıştır, dolayısıyla, yaptığım türde ayırmalar, nesneler o bellek alanıyla ilgili dağınık hale geldikçe sonunda bir OOM hatasına neden olur. Bunlar yönetilen yığınlar olarak bilinir.

Bir nesne oluşturmak için tek yapmanız gereken yeni anahtar kelimeyi kullanmak; .NET, nesneyi doğru yığının üzerine oluşturmaya, başlatmaya ve yerleştirmeye ve gerekli ek bellekleri ayırmaya özen gösterir. Bundan sonra, bu nesneyi oldukça fazla unutabilirsiniz, çünkü işiniz bittiğinde onu silmeniz gerekmez.

Yeni anahtar kelimeyi kullanarak bir referans metni nesnesi, yığının üzerine yerleştirilir ve referans akım çalışan istif içinde en çok kullanılan oluşturmak

. Nesneniz refrence olarak kullanılabilecek diğer olası kaynak vardır:

  1. küresel/statik nesne referansları
  2. CPU geçti (daha sonra diğer)
  3. nesne sonuçlandırma referanslarını
  4. Interop'un başvuruları (NET nesneleri kaydeder çoğunlukla burada kullanılan
  5. yığın referanslar()

) COM/API çağrıları Bunlar 5 whe aslında GC kök düğümleridir referans nesne hiyerarşisi oluşturulur. Genellikle sipariş sınıflarını saklayan bir koleksiyona sahip klasik Müşteri sınıfını düşünün. Sipariş koleksiyonuna bir Sipariş eklendiğinde, koleksiyonun kendisi eklenmiş siparişe bir referans tutar. Müşteri sınıfının örneğinin de buna bir yığın başvurusu varsa.

Karmaşık bir nesne için hiyerarşinin nasıl oluşturulduğu budur, GC referansları nasıl görür.

e: g. Müşteri nesnesi için yığın referansı -> siparişlerin List nesnesine referans -> referans bireysel siparişler. Bu 5 kökten gelen gevşek referanslar GC'ye eğilimli olan herhangi bir şeydir.Bellek nesnelere nasıl tahsis

biraz karmaşıktır ve usally basit bir örnek olabilir belirtilen http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

MKK olarak zamanla büyür:

class MyClass 
{ 
    string Test="Hello world Wazzup!"; 
    byte[] data=new byte[86000]; 
} 

olduğunu düşünmek kolay olduğunu Sınıfım boyutu ayrılan zaman içerir:

19 • karakterler 86000 bayt •

. Aslında, nesnenin boyutu yalnızca genel sınıf öğelerini ve nesne işaretleyicilerini dizeye ve bayt dizisine (sınıf düzeyi değişkenleri) depolamak için gereken belleği içerecek ve daha sonra yığınlara ayrı olarak atanacaktır. Dize SOH'ye ve sınıfın örneği tarafından tutulan nesne referansına tahsis edilecektir; bayt dizisi, 85 KB'den büyük olduğu için LOH'ye atanacaktır. LOH, bellekte parçalanma olabilirken, SOH sıkıştırılabilir ve parçalanma olmayacaktır.

Saygılarımızla.

İlgili konular