SORU
16 HAZİRAN 2013, Pazar


Anlayış Çöp Toplama .net

Aşağıdaki kodu göz önünde bulundurun:

public class Class1
{
    public static int c;
    ~Class1()
    {
        c  ;
    }
}

public class Class2
{
    public static void Main()
    {
        {
            var c1=new Class1();
            //c1=null; //if this line is not commented out, at the Console.WriteLine call, it prints 1
        }
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Console.WriteLine(Class1.c); //prints 0
        Console.Read();
    }
}

Şimdi, benim için bu bile değişken c1 ana yöntemdir kapsam ve başvurulan daha da başka herhangi bir nesne GC.Collect() denir, neden değil kesinleşmiş var mı?

CEVAP
16 HAZİRAN 2013, Pazar


Burada ve bir hata ayıklayıcı kullanarak çünkü çok yanlış bir sonuca takıldı. Kodunuz kullanıcı makine çalışır şekilde çalıştırmanız gerekir. Serbest Yapılandırma Yöneticisi İnşa ile inşa ilk geçin değişikliği "Etkin çözüm yapılandırması" Birleşik sol üst köşesinde"". Serbest bırakmak için Ardından, Araçlar Seçenekler gidin, hata Ayıklama, Genel ve işaretini kaldırın "TAM zamanında optimizasyon Bastırmak" seçeneği.

Şimdi programı tekrar çalıştırın ve kaynak kodu ile tamircilik. Fazladan ayraçlar hiçbir etkiye sahip nasıl not. Ve nasıl NOT null değişkeni ayarında, hiç fark etmez. Her zaman baskı olur ve "1". Şimdi umduğunuz şekilde çalışır ve iş gelmezdi.

Hata Ayıklama yapı çalıştırdığınızda çok farklı çalışıyor neden anlatma vazifesi ile kalkıyor. Bu çöp toplayıcı yerel değişkenleri keşfeder ve bir hata ayıklayıcı mevcut olan etkilenen nasıl açıklamam gerekir.

Öncelikle, titreme yaparikimakine koduna bir yöntem için IL derler önemli görev. İlk hata, makine hata Ayıklama ile kodu görebilirsiniz Demontaj Windows penceresinde görünür. İkinci GÖREVİ ANCAK tamamen görünmez. Ayrıca yöntem vücut içindeki yerel değişkenlerin nasıl kullanıldığını açıklayan bir tablo oluşturur. Bu tablo iki adres ile yöntem bağımsız değişken, yerel değişken ve her biri için bir giriş vardır. İlk değişken bir nesne başvurusu mağazası nerede Adres. Ve makine adresi bu değişken artık eskiden olduğu talimatı kod. Bu değişken yığın çerçevesi ya da bir cpu kasada saklı olup olmadığını da.

Bu tablo koleksiyonu gerçekleştirdiğinde nesne başvuruları için nereye bakılacağını bilmek gerekir çöp toplayıcı, esastır. Oldukça kolay başvuru GC yığını üzerinde bir nesnenin bir parçası yapmak. Kesinlikle nesne başvurusu bir CPU kayıt saklanır zaman yapmak kolay değil. Tabloya bak diyor.

"Bu tablo çok önemli. adresi" artık kullanılmıyor Çöp toplayıcı çok yaparverimli. Eğer bir yöntem içinde kullanıldığında bile bir nesne başvurusu toplayabilir, ve bu yöntem yürütme henüz bitirmedi. Çok yaygın olan, Ana olan) örneğin yöntem sadece şimdiye kadar sadece programı sona önce durur. Açıkça herhangi bir nesne başvuran Ana içinde kullanılan istemem() yöntemi bir sızıntı anlamına geleceğini programın süresi, yaşamak için. Jetta gibi bir yerel değişken artık yararlı, o Ana program içinde ilerlemiştir ne kadar bağlı olduğunu bulmak için tablo kullanabilirsiniz() bir çağrı yaptı. önce yöntemi

Bu tablo ile ilgili bu neredeyse sihirli bir yöntem GC.() Canlı tutma. Birçoközel yöntem, herhangi bir kod oluşturmak değil. Onun tek görevi bu tabloyu değiştirmek için.uzanıryerel değişken yaşam, çöp almak depolar başvurusu önlenmesi topladı. Olmaktan GC durdurmak için Aşırı hevesli bir referans toplama ile kullanmak için gereken tek zaman, bir referans yönetilmeyen kod geçirildiği birlikte çalışabilirlik senaryolarda olabilir. Çöp toplayıcı bu tür başvurular Jetta ile derlenmiş değildi beri böyle bir kod tarafından kullanılan görmek için nereye başvuru için diyor masası yok. EnumWindows gibi yönetilmeyen bir işlev için bir temsilci nesnesi geçen() GC kullanmak için ihtiyacınız olduğunda klişe örneğidir.() Canlı tutma.

Bu Yayın oluşturmaya çalışan sonra numune Pasajı söyleyebilirim yani, yerel değişkenlerolabiliryöntem yürütme bitmeden erken topladı. Hatta daha keskin bir nesne yöntemlerinden biri varsa bu yöntem artık başvuruyorsa çalışırken toplanan alabilirbu. Bununla ilgili bir sorun var, çok garip böyle bir hata ayıklama yöntemi. Peki Gözcü penceresinde değişken koymak ya da kontrol edebilirsiniz beri. Öyle de oluryokeğer bir GC oluşursa, hata ayıklaması yaptığınız sırada. Bu değişimi çok tatsız olurdufarkındaorada bir hata ayıklayıcı ekli olma. O zamandeğiştirirtablo ve değiştirir "son" Adres. kullanılan Ve bu yöntem son eğitim adres için normal değerini değiştirir. Yöntem dönmedi sürece değişken hayatta tutar. Senin yöntemi dönünceye kadar onu izlemeye devam etmek için izin verir.

Bu şimdi de daha önce gördüklerini ve bir soru sordun açıklıyor. "" GC.0 yazdırır Başvuru yapamazsınız ödemeli arama toplamak. Tablo değişkeni olarak çalıştığını bildirdigeçmişGC.() Ödemeli arama, onca yolu yöntemi sonuna kadar. Böylece hata ayıklayıcı ekli olması demek zorundavehata Ayıklama yapı çalıştırarak.

Null değişkeni ayarı GC değişkeni inceleyin ve artık bir referans göreceksiniz, çünkü bir etkiye sahip. Ama tuzak çok düşüş yoksa emin olun C# programcılar, kod anlamsız olduğunu aslında yazmak düştü. Ya da bu ifadeyi açıklamasında kodu çalıştırdığınızda mevcut olup olmadığını hiçbir farkı yok gibi inşa ediyor. Aslında, titreme iyileştiriciKaldırbunun hiçbir etkisi yok beri deyim. Öyle olsa bile böyle bir kodu yazmak değil, emin olungörünüyordubir etkiye sahip.


Bir Office uygulaması ile bir şey yapmak için küçük programlar yazmak bu konu, bu sorun programcılar alır nedir hakkında son bir not. Hata genellikle Yanlış Yolda onları alır, Office programını talep üzerine çıkmak istiyorlar. Bunu yapmak için uygun bir yol GC çağırarak.() Toplamak. Ama onlar kendi uygulama hata ayıklama, onlara giden asla-asla Mareşal arayarak inince çalışmıyor olduğunu fark ederler.() ReleaseComObject. Manuel bellek yönetimi, nadiren kolayca görünmez bir arabirime başvuru görmezlikten gelirler çünkü düzgün çalışıyor. GC.() Toplama uygulaması hata ayıklama gerçekten çalışıyor sadece.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012
  • Shameless Maya

    Shameless Ma

    24 Mayıs 2012
  • whatever

    whatever

    30 EYLÜL 2005