10

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

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

4

2 回答 2

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();
于 2010-07-19T23:30:57.650 回答
1

这也是我远离 JAXB 的原因之一。我宁愿编写类来编组和解组分别实现javax.xml.bind.Marshaller和。javax.xml.bindUnmarshaller我写一次就完成了。没有那种反射和动态类生成。

于 2010-07-15T22:44:47.543 回答