我是否有JAXB类加载器泄漏

时间:2010-07-15 19:38:02

标签: java memory-leaks classloader permgen

我在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]

这是否表示泄漏?如果是,我该如何解决?

2 个答案:

答案 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.Marshallerjavax.xml.bindUnmarshaller的类。我写了一次,然后就完成了。没有反射和动态类生成。