2010-01-08 15 views
10

Şu anda bir sınıf yüklemeye çalışan ancak bu sınıfı bulamadığı için başarısız olan bir (kısmi) programım sorunu yaşıyorum. Yığın izine baktığımda, neden için VM'nin bu özel sınıfı öncelikle yüklemeye çalıştığı konusunda herhangi bir neden göremiyorum. Belirli bir sınıfın neden yüklenmekte olduğunu anlayabilmem için herhangi bir araç var mı?Java: Bulma * neden * bir sınıf yüklendi

İpucu: JVM, sınıfı (bir aracı aracılığıyla) yüklemeye çalıştığı tam noktada bir yığın izini zaten alıyorum. Ancak yığın izleme, satır numarası içermez. Bu nedenle, hangi yöntemin yüklenmekte olduğunu yalnızca hangi yöntemin tetiklediğini biliyorum. Daha sonra, ifadeyi bilmek bile yeterli olmayabilir. Tek bir ifade, bir sınıfın birçok şekilde yüklenmesine neden olabilir, çünkü bazen VM'nin sınıfların geçişli kapanmasının bir kısmını yüklemesi gerekir.

+1

Java ile aşina değilim, ama bu sınıfın alay edilmesini sağlamaya ve arama yığına bakmaya ne dersin? Eğer yine de bu mümkün ise Java. – balpha

+3

Belki birileri bunu kullanabileceğinden, Stack Trace'i buraya gönderebilirsiniz. –

+0

Doğrulayıcı bir yan etkisi olabilir (bkz. Java Puzzlers). Ancak daha fazla bilgi gerekiyor. –

cevap

19

Programınızı -XX:+TraceClassLoading ve -XX:+TraceClassResolution bayraklarıyla çalıştırın. Belirli bir sınıf için RESOLVE mesajlarının zincirini takip gerekir

[Loaded com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader from file:/home/kgregory/Workspace/Website/programming/examples/bin/] 
RESOLVE com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader java.net.URLClassLoader 
RESOLVE java.net.URLClassLoader java.lang.Class URLClassLoader.java:188 

: Bu aşağıdaki gibi görünüyor çıktı bir LOT yaratacaktır. Ya da büyük olasılıkla, programınız sınıfı yüklemeye çalıştığında bir hata görürsünüz, bunu yükleyen sınıfın mesajlarını çözerek alırsınız).

+0

Bu işe yarar görünüyor.Onu kontrol edeceğim, teşekkürler! – user66237

+0

İhtiyacım olan şey olduğu ortaya çıktı! Günümü aldım! Çok teşekkürler! – user66237

+0

Tam olarak ne Ama benim gibi sıradan olmayan insanlara dikkat et: Eğer körü körüne "-XX: + TraceClassLoading ve -XX: + TraceClassResolution" argümanlarını seçip kopyalıyorsan, bunu kullandığınızda aralarındaki "ve" yi kopyalamayın. Pilot hata olduğunu anlamamı ne kadar sürdüğüne inanamıyorum. –

5

Hangi sınıfların bu sınıfa başvurduklarını görmek için JDepend gibi bir statik analiz aracını deneyebilirsiniz.

+1

Zaten bunu yaptım ama bağımlılıklar oldukça ince. Yüklenen sınıf, sınıf yüklendiğinde yürütülmekte olan yöntemde belirtilmez. Mevcut yöntemde bir türün bir sınıfının bir süper sınıfının bir süper sınıfının bir süper sınıfı gibi bir şey olmalı ... demek istediğimi anlıyorsun. – user66237

0

classloaders

çoklu sınıf yükleyiciler dikkatli olmak gerekir (web uygulaması gibi) oyunda olduğu bir yaşadığı çevre buysa. Lütfen uygulamanın ne olduğunu söyle.

kaynak

nerede kavanozlar ve yüklenirken hangi sınıf (siz/dir yapısını dosya) yerini söylersen. Class.forName kullanarak dinamik olarak yüklüyor musunuz? ya da bahar ya da IOC'nin başka bir çerçevesi kullanılıyor mu? Ana sınıf mı?

Bazı önceki test (bize yardımcı olmak için)

Belki ana yöntemi içinde Class.getResource() kullanarak bazı şeyleri test edebilirsiniz. Eğer sınıf foo.bar.Clazz ise, geçerli bir şey döndürüp döndürmediğini görmek için Class.getResource ("/ foo/bar/Clazz.class") 'ı deneyin. Aynı şeyi, başarısız olduğunuz sınıfı yüklediğiniz sınıfla birlikte yapmayı deneyin.

+0

Zaten JVM'nin sınıfı (bir aracı aracılığıyla) yüklemeye çalıştığı noktada bir yığın izini alıyorum. Ancak yığın izleme, satır numarası içermez. Bu nedenle, hangi yöntemin yüklenmekte olduğunu yalnızca hangi yöntemin tetiklediğini biliyorum. – user66237

+0

Amacım, sınıfın sorunlu sınıf yükünü provoke etmesinin beklenen sınıf yükleyicide (kavanoz diyelim) ya da diğerinde olup olmadığını görmek oldu.Tabii ki, eğer birden fazla sınıf yükleyiciniz varsa ... :( – helios