JAXB - ошибка permGen на сервере Tomcat - PullRequest
1 голос
/ 20 сентября 2009

Я получаю приведенную ниже ошибку при запуске моего развернутого приложения. Судя по ошибке, JAXB, кажется, является ее причиной. Пожалуйста, предложите.

java.lang.OutOfMemoryError: PermGen space
    com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.createClassInfo(RuntimeModelBuilder.java:99)
    com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.createClassInfo(RuntimeModelBuilder.java:70)
    com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:228)
    com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89)
    com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:198)
    com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84)
    com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70)
    com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:304)
    com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:319)
    com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:430)
    com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
    com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100)
    com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143)
    com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    javax.xml.bind.ContextFinder.find(ContextFinder.java:376)
    javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    MyJava.GetUserProfile.user(GetUserProfile.java:87)
    com.myapp.struts.TokenDirected.execute(TokenDirected.java:81)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Ответы [ 4 ]

1 голос
/ 05 июля 2011

Была такая же проблема в Tomcat 5.5 JAXB вызовет много утечек памяти, поскольку он создает кучу статических переменных на сервере.

Ссылка: http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java http://blogs.oracle.com/fkieviet/entry/how_to_fix_the_dreaded

0 голосов
/ 03 ноября 2009

Это не связано с JAXB, но вашему Tomcat требуется больше памяти от JVM, поэтому используйте что-то вроде

-Xms128m -Xmx512m -XX:128m
0 голосов
/ 17 декабря 2009

Проблема связана с JaxBContext. Каждый раз, когда вы используете новый контекст, загружаются новые классы. Если вы повторно используете свой контекст, все будет хорошо.

Даффино прав:)

0 голосов
/ 20 сентября 2009

Сначала увеличьте размер вашего перми. Эта ссылка показывает вам, как.

Отслеживайте использование памяти с помощью Visual GC, чтобы увидеть, как это помогает.

Если этого не произойдет, избавьтесь от JAXB. Я уклоняюсь от этого именно по этой причине. Лучше сделать свой ОХМ вручную, чем полагаться на него.

...