Есть ли у меня утечка JAXB classloader - PullRequest
10 голосов
/ 15 июля 2010

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

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

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

[Загруженный com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID из JVM_DefineClass ] [Загруженный com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID из * * * * * * * * * * * * * *указать на утечку?Если так, как я могу решить это?

Ответы [ 2 ]

9 голосов
/ 20 июля 2010

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

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

По сути, проблема заключалась в том, что я делал новый 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 голос
/ 16 июля 2010

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

...