У меня есть утечка класса JAXB

У меня есть приложение, развернутое на Glassfish. Со временем количество загруженных классов взлетает на миллионы, и мой пермен, кажется, растет.

Чтобы помочь устранить неполадку, я добавил следующие аргументы jvm. -XX: + PrintGCDetails -XX: + TraceClassUnloading -XX: + TraceClassLoading

Теперь, наблюдая за выходом, я вижу, что одни и те же классы загружаются снова и снова. В основном каждый раз, когда вызывается веб-служба, и JAXB используется для обработки xml.

[Загружен com.strikeiron.ZIPCodesInRadius $JaxbAccessorF_userID от JVM_DefineClass] [Загружен com.strikeiron.ZIPCodesInRadius $JaxbAccessorF_userID от JVM_DefineClass]

Это указывает на утечку? Если да, то как мне его решить?

Ответ 1

Я нашел похожую тему, описывающую ту же проблему, что и я. http://forums.java.net/jive/thread.jspa?threadID=53362

Я также нашел ошибку на https://github.com/javaee/jaxb-v2/issues/581

По сути, проблема заключалась в том, что я делал новый JAXBContext ("your.class.xsd") каждый раз, когда вызывался мой бин. Согласно ошибке "Вызов JAXBContext.newInstance(...) подразумевает перезагрузку всего, так как должен использоваться (или re-) загрузчик текущего или указанного класса".

Решением было создать синглтон, который отлично работал.

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();

Ответ 2

Это одна из причин, почему я держусь подальше от JAXB. Я бы предпочел написать классы для маршала и демонстрации, которые реализуют javax.xml.bind.Marshaller и javax.xml.bindUnmarshaller, соответственно. Я пишу их один раз, и все готово. Ничего из этого отражения и динамического поколения классов.