2010-07-15 22 views
7

Glassfish üzerinde kurulu bir uygulama var. Zamanla yüklü sınıfların sayısı milyonlara çıkıyor ve benim permenim yükseliyor gibi görünüyor.JAXB sınıf yükleyici sızıntısı var

Sorunları gidermek için aşağıdakileri jvm argümanlarıma ekledim. XX: + PrintGCDetails XX: + TraceClassUnloading XX: + TraceClassLoading çıkışını izlerken

Şimdi, aynı sınıfları tekrar tekrar yüklendi ve görüyoruz. Temel olarak her defasında bir web servisi çağrılır ve xml işlemek için JAXB kullanılır.

bu sızıntı gösteriyor mu [JVM_DefineClass Yüklendi com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID] [JVM_DefineClass dan com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID Loaded]? Eğer öyleyse nasıl çözerim?

cevap

6

Sahip olduğum aynı sorunu açıklayan benzer bir iş parçacığı buldum. http://forums.java.net/jive/thread.jspa?threadID=53362

Ben de Temelde, sorun ben ("your.class.xsd") Yeni bir JAXBContext benim fasulye başlatıldığı her zaman yaptığını oldu https://java.net/jira/browse/JAXB-581

bir hata buldum. Hataya göre "JAXBContext.newInstance (...) çağrısı, geçerli veya belirtilen sınıf yükleyicinin (yeniden) kullanılmasından beri her şeyin yeniden yüklenmesini ifade eder." Bu çözüm, harika çalışan bir singleton yaratmaktı.

public enum JAXBContextSingleton { 

INSTANCE("your.class.xsd"); 
private JAXBContext context; 

JAXBContextSingleton(String classToCreate) { 
    try { 
     this.context = JAXBContext.newInstance(classToCreate); 
    } catch (JAXBException ex) { 
     throw new IllegalStateException("Unbale to create JAXBContextSingleton"); 
    } 
} 

public JAXBContext getContext(){ 
    return context; 
} 

} 

Ve singleton'ununu kullanmak

JAXBContext context = JAXBContextSingleton.INSTANCE.getContext(); 
0

Bu, JAXB'den uzak durmamın nedenlerinden biridir. Sırasıyla javax.xml.bind.Marshaller ve javax.xml.bindUnmarshaller'u uygulayan mareşal ve unmarshal sınıflarını yazmayı tercih ederim. Onları bir kez yazarım ve bitti. Bu yansıma ve dinamik sınıf neslinin hiçbiri.