2010-07-15 72 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编组和解组。我写了一次,他们完成了。没有一个反思和动态类的一代。