tomcat启动报错:java.lang.NoClassDefFoundError

  tomcat 启动加载 spring 配置文件时报错,找不到类 GetHelloRequest,经排查实际上该类已经存在。后来发现日志里还有一句: This is very likely to create a memory leak,怀疑内存不足,看了下环境,起了不少 tomcat 进程,杀掉几个再重启 tomcat,这次就拉起来了。

  具体 catalina.out 里的报错日志如下:

09-May-2017 10:47:38.380 SEVERE [localhost-startStop-1] org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed
 java.lang.NoClassDefFoundError: GetHelloRequest
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:241)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1073)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:778)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:843)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4745)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: GetHelloRequest
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
    ... 30 more

09-May-2017 10:47:38.383 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
09-May-2017 10:47:39.410 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [1,026] milliseconds.
09-May-2017 10:47:39.410 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
09-May-2017 10:47:39.417 INFO [localhost-startStop-1] org.springframework.web.context.support.XmlWebApplicationContext.doClose Closing Root WebApplicationContext: startup date [Tue May 09 10:47:36 CST 2017]; root of context hierarchy
09-May-2017 10:47:39.430 WARNING [localhost-startStop-1] org.springframework.web.context.support.XmlWebApplicationContext.doClose Exception thrown from LifecycleProcessor on context close
java.lang.IllegalStateException: LifecycleProcessor not initialized
- call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Tue May 09 10:47:36 CST 2017]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:
416)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:
979)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:
938)
at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:
581)
at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:
116)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:
4792)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:
5429)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:
226)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:
154)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:
1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:
1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:
266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
617)
at java.lang.Thread.run(Thread.java:
745)

09-May-2017 10:47:39.443 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [ROOT] appears to have started a thread named [pool
-2-thread-1] but has failed to stop it.
This
is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:
175)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:
2039)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:
1088)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:
809)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:
1067)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
617)
java.lang.Thread.run(Thread.java:
745)
09-May-2017 10:47:39.444 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [ROOT] appears to have started a thread named [pool
-2-thread-2] but has failed to stop it.
This
is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:
215)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:
2078)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:
1093)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:
809)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:
1067)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
617)
java.lang.Thread.run(Thread.java:
745)
09-May-2017 10:47:39.444 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [ROOT] appears to have started a thread named [nioEventLoopGroup
-2-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:
269)
sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:
93)
sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:
86)
sun.nio.ch.SelectorImpl.
select(SelectorImpl.java:97)
io.netty.channel.nio.SelectedSelectionKeySetSelector.
select(SelectedSelectionKeySetSelector.java:62)
io.netty.channel.nio.NioEventLoop.
select(NioEventLoop.java:732)
io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:
388)
io.netty.util.concurrent.SingleThreadEventExecutor$
5.run(SingleThreadEventExecutor.java:858)
io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:
144)
java.lang.Thread.run(Thread.java:
745)

 

  如上标黄处,最开始的异常是类找不到,接着说 tomcat 拉起了pool-2-thread-1pool-2-thread-2,而且起来失败后它自己没能关掉,提示我们会存在内存溢出的风险。因为后台确实存在多个 tomcat 进程,所以怀疑类加载失败是不是因为内存不够导致的。