2013-09-02 16 views
7

Daha önce Java'da bir Hizmette Özel Nesneleri kullandım ve her zaman arka uçta çalışmayı sürdürdüm ve bazen Çöp Toplayıcı tarafından nesne yok edildiğinde NULL_POINTER_EXCEPTION gösterdiği izlerle Bug raporları aldım. Tüm yüksek son cihazlara sahip olduğum için, statik bir son nesnenin çöp toplayıcı tarafından yok edilmesini veya yok edilmesini test edemiyorum?Statik bir final Nesne, Çöp Toplayıcı tarafından silindi mi?

+1

Neden C++ ve C# etiketleriniz var? – nogard

+7

Visual Basic etiketini unuttun ... –

+0

"Özel nesne servisi", "ileri teknoloji aygıtları" - hangi platform bu? Bu özellikle Android JVM mi? – Rup

cevap

3

Statik bir Son Nesne, Çöp Toplayıcı tarafından silindi mi?

  1. static ile sınıf yüklü classloader ulaşılamaz hale gelir:

Bunun olabileceğini üç koşul düşünebiliriz. Ancak bu,'dan sonra sadece olabilir, kodunuz hiçbir şeyin nesnenin GC'd olduğunu fark edemeyeceği bir noktaya ulaştı!

  • Bir şey null'u static final'a atamak için "kötü yansıtıcı hileler" kullanmıştır. (Evet, yapılabilir ...)

  • Bir şey kurnazı kurnazca bozuyor; Örneğin. bazı arabası JNI/JNA kodu. Eğer olduğundan (görünüşte) GC'd olmanın nesnenin etkisi gözlemleyerek o

  • Not, bu GC'd olmanın classloader doğrudan bir sonucu olamaz. Başka bir şey, sınıf yükleyicisi ve final static'un GC'ed olması için mümkün olsaydı ... eğer gerçekten burada olan şey buysa.


    Aslında senin sorunun GC-ilişkili olmadığı şüpheli. Daha ziyade, hizmetinizin oturum açılmayan denetlenmeyen bir istisna nedeniyle ölmekte olduğundan şüpheleniyorum."Ana" dışındaki iş parçacıklarındaki yakalanmamış istisnalar için varsayılan davranış, bunları sessizce yok saymaktır.

    Hizmet iş parçacıklarınızın, run() yöntemindeki catch yöntemiyle veya "yakalanmamış bir istisna işleyici" ile tüm özel durumları günlüğe kaydetmediğini kontrol etmenizi öneririz.

    1

    JVM, GC "kök" konumlarındaki tüm canlı referansları (mevcut çağrı yığındaki tüm nesneler gibi) incelemesi gereken bir işaret süpürme GC algoritması kullanır. Her canlı nesne canlı olarak "işaretlenir" ve canlı bir nesne tarafından atıfta bulunulan herhangi bir nesne de canlı olarak işaretlenir.

    Markalama aşamasının tamamlanmasından sonra, GC işaretlenmemiş tüm nesneler için hafızayı serbest bırakarak (kalan canlı nesneler için belleği sıkıştırır) yığın boyunca süpürür.

    ben "hayır 'final' tadil edici maddeye GC onun iş yükünü azaltmaya yardımcı olmaz" demek için gidiyorum.

    6

    Normal Java Uygulamasında (Android hakkında emin değilim), statik sonlandır atıfta bulunulan nesne yalnızca uygun ClassLoader kaldırıldığında GCed edilir.

    her web uygulaması undeploying, (örneğin Tomcat) bir kap içinde birden fazla internet uygulamaları olan, örneğin, bir uygulamanın ClassLoader unloades, bu uygulamanın statik son referans nesne GCed olacaktır. Ancak diğer ClassLoader'lar tarafından yüklenen nesneler (örneğin, diğer web uygulamalarının ClassLoader'ları, ortak ClassLoader, boot-strap ClassLoader gibi) GCed olmayacaktır.

    Yani sorunun cevabı şudur: ClassLoader de-etkin olup olmadığına bağlıdır.

    İlgili konular