我们这里有一个很奇怪的问题。

jvm:尝试1.7.0_55-b13和1.7.0_75-b13

雄猫:7.0.56

os:Ubuntu 12.04.5 LTS(64bit)(3.5.0-23-generic)

结合使用tomcat和使用spring构建的大型应用程序。

在我们的生产环境之一中,有时有时会始终使用相同的堆栈跟踪来获取“ NoClassDefFound”。

它只会在一段时间后发生,并且可以通过特定的工作流程进行测试。但是,存在标记为“未找到”的类(在WEB-INF / lib的jar中),并且在出现问题和引发异常之前已多次使用:可以成功执行上述特定工作流程白天多次。工作流以某种方式停止工作并开始引发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


任何人都知道类似的问题吗?

最佳答案

我已解决问题,在此发布解决方案。也许它将在某个时候以某种方式帮助某人:)

问题不在于我们一开始所要强调的:类定义没有从类加载器中消失,但是起初没有初始化(启动)。

这是导致错误的工作流程:Tomcat上一次停止运行时,它将其会话序列化为文件(根据默认的会话存储机制)。

再次启动该应用程序时,由于初始化用于反序列化其实例的类时,tomcat由于“ ExceptionInInitializerError”而无法重新加载其会话。

然后,对该类的所有后续调用(未正确初始化)都产生了我们在问题(NoClassDefFound)中看到的堆栈跟踪。

ExceptionInInitializerError的原因是,序列化的类尝试静态调用spring上下文(当时未初始化的上下文,然后产生了导致ExceptionInInitializer的NullPointerException)。

09-10 23:54