编程语言
首页 > 编程语言> > java – 我有一个JAXB类加载器泄漏

java – 我有一个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://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();

标签:permgen,java,memory-leaks,classloader
来源: https://codeday.me/bug/20190927/1824122.html