我是否有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.Marshaller
和javax.xml.bindUnmarshaller
编组和解组的类。 我写了一次,然后就完成了。 没有reflection和动态类生成。