2010-07-15 22 views
7

我有一個應用程序部署在Glassfish上。隨着時間的推移,被加載的班級數量攀升至數百萬人,而且我的冒險似乎在上升。我有一個JAXB類加載器泄漏

爲了幫助排除故障,我將以下內容添加到我的jvm參數中。 -XX:+ PrintGCDetails -XX:+ TraceClassUnloading -XX:+ TraceClassLoading

現在看輸出的時候,我看到了相同的類加載一遍又一遍。基本上每次調用Web服務時都使用JAXB來處理xml。

[加載com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID從JVM_DefineClass]

這是否說明有泄露[從JVM_DefineClass加載com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID]如果是這樣,我該如何解決它?

回答

6

我發現了一個類似的線程,描述了我遇到的同樣的問題。 http://forums.java.net/jive/thread.jspa?threadID=53362

我還發現了一個bug在 https://java.net/jira/browse/JAXB-581

基本上,問題是,我在做一個新的JAXBContext(「your.class.xsd」)每一個我的豆被調用的時間。根據錯誤「調用JAXBContext.newInstance(...)意味着重載所有內容,因爲當前或指定的類加載器將被(重新)使用。」

解決的辦法是創建一個效果很好的單身人士。

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; 
} 

} 

,並使用單

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

這是我遠離JAXB的原因之一。我寧願寫課程分別執行javax.xml.bind.Marshallerjavax.xml.bindUnmarshaller編組和解組。我寫了一次,他們完成了。沒有一個反思和動態類的一代。