Определение класса исчезает из jvm с течением времени (NoClassDefFound)

У нас здесь очень странная проблема.

jvm: пробовал 1.7.0_55-b13 и 1.7.0_75-b13

кот: 7.0.56

ОС: Ubuntu 12.04.5 LTS (64-разрядная версия) (универсальная версия 3.5.0-23)

Использование tomcat с большим приложением, созданным с помощью пружины.

В одной из наших производственных сред иногда мы получаем "NoClassDefFound" всегда с одной и той же трассировкой стека.

Это происходит только через некоторое время и может быть протестировано с определенным рабочим процессом. Тем не менее, класс, помеченный как "не найден", существует (в банке в WEB-INF/lib) и использовался несколько раз до появления проблемы и запуска исключения: конкретный рабочий процесс, упомянутый выше, может быть успешно выполнен много раз в течение дня. Каким-то образом рабочий процесс перестает работать и начинает генерировать исключения NoClassDefFound.

Кажется, что класс загружается, используется, а затем со временем исчезает из jvm.

JVM работает со следующими аргументами:

-XX:+UseConcMarkSweepGC 
-Xmx6900m 
-Xms2000m 
-XX:MaxPermSize=900m     
-XX:+UseParNewGC 
-XX:+CMSParallelRemarkEnabled 
-XX:NewRatio=1 
-XX:TargetSurvivorRatio=75 
-XX:SurvivorRatio=8 
-XX:+AggressiveOpts 
-XX:ReservedCodeCacheSize=256m 
-Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
-Djava.awt.headless=true 
-Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.port=2037 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.71.1.112 
-Dcom.sun.management.jmxremote.password.file=/etc/tomcat7/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/etc/tomcat7/jmxremote.access 
-Djava.net.preferIPv4Stack=true 
-Djava.endorsed.dirs=/usr/share/tomcat7/endorsed 
-classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar 
-Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 
-Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start

Кто-нибудь знает о подобных проблемах?

1 ответ

Решение

Я исправил проблему и здесь выкладываю решение. Может быть, это кому-нибудь когда-нибудь поможет где-нибудь:)

Проблема не в том, о чем мы думали поначалу: определение класса не исчезло из загрузчика классов, но не было инициализировано вначале (запуск).

Вот рабочий процесс, который вызвал ошибку: Когда tomcat последний раз останавливался, он сериализировал свои сеансы в файл (в соответствии с механизмом хранения сеансов по умолчанию).

Когда приложение было запущено снова, tomcat не удалось перезагрузить свои сеансы из-за "ExceptionInInitializerError" при инициализации класса для десериализации его экземпляров.

Затем все последующие вызовы этого класса (которые не были должным образом инициализированы) дали трассировку стека, которую мы видим в вопросе (NoClassDefFound).

Причиной ExceptionInInitializerError было то, что сериализованный класс попытался статически вызвать контекст пружины (контекст, который не был инициализирован в то время, затем создал исключение NullPointerException, которое вызвало ExceptionInInitializer).

Другие вопросы по тегам