我在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]
这是否表示泄漏?如果是,我该如何解决?
答案 0 :(得分:9)
我发现了一个类似的线程,它描述了我遇到的同样问题。 http://forums.java.net/jive/thread.jspa?threadID=53362
我也发现了一个错误 https://github.com/javaee/jaxb-v2/issues/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();
答案 1 :(得分:1)
这是我远离JAXB的原因之一。我宁愿编写类来编组和解组分别实现javax.xml.bind.Marshaller
和javax.xml.bindUnmarshaller
的类。我写了一次,然后就完成了。没有反射和动态类生成。