我是否有JAXB类加载器泄漏

我在Glassfish上部署了一个应用程序。 随着时间的推移,加载的课程数量攀升至数百万,而我的permgen似乎也在增加。

为了帮助排除故障,我将以下内容添加到了我的jvm参数中。 -XX:+ PrintGCDetails -XX:+ TraceClassUnloading -XX:+ TraceClassLoading

现在,当观察输出时,我看到一遍又一遍地加载相同的类。 基本上每次调用Web服务时都会使用JAXB来处理xml。

[从JVM_DefineClass加载com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID] [从JVM_DefineClass加载com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID ]

这是否表明泄漏? 如果是这样我该如何解决?

我找到了一个类似的线程,描述了我遇到的同样问题。 http://forums.java.net/jive/thread.jspa?threadID=53362

我还在https://java.net/jira/browse/JAXB-581上发现了一个错误

基本上,问题是每次调用bean时我都在做一个新的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(); 

这是我远离JAXB的原因之一。 我宁愿编写分别实现javax.xml.bind.Marshallerjavax.xml.bindUnmarshaller编组和解组的类。 我写了一次,然后就完成了。 没有reflection和动态类生成。