2011-12-12 77 views
1

我有两个看起来完全相同的虚拟机(从相同的虚拟机模板创建,区分Tomcat文件夹与主机名配置无关)。在这两台机器上,都部署了相同的Web应用程序。Tomcat没有找到现有类

一台机器工作正常。在另一台机器上,我得到错误,因为没有找到类。我重新启动了tomcat 3次,并且在不同的应用程序中总是得到不同的错误。一个这样的错误是这样的:

java.lang.NoClassDefFoundError: org/springframework/web/context/request/ServletRequestAttributes 
    org.springframework.web.context.request.RequestContextListener.requestInitialized(RequestContextListener.java:64) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 
    org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
    org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776) 
    org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705) 
    org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898) 
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
    java.lang.Thread.run(Thread.java:662) 

在这种错误的每一次出现至今,丢失类(例如ServletRequestAttributes)驻留在同一罐为需要它(例如RequestContextListener)的类。

我在两台机器上都使用CentOS,Apache 2.2.3,Tomcat 6.0.30和Oracle JDK 1.6.0_24。 Tomcat配置了大量的堆和perm gen空间(两台机器也相同)。


看来Tomcat 6 "losing" classes in production是一个类似的问题,但目前还没有解决方案。

一个可能存在的问题是“您可能已达到操作系统中打开的文件句柄的最大数量”。与最基本的Linux知识,我成功地执行在互联网上发现了一些命令,告诉我,

  • 最大文件句柄是6815744在两台机器上(cat /proc/sys/fs/file-max
  • 当前使用情况是10710的失败和10200正确的机器(cat /proc/sys/fs/file-nr),对每个进程
  • 最大文件句柄是1024(ulimit -n),被Tomcat
  • 当前使用情况是641的失败和686正确的机器(lsof -p <TOMCAT-PID> | wc -l)上。

UPDATE:我重新启动Tomcat的失败,并在浏览器在一旦打开的所有应用程序。 Tomcat的的文件使用率上升到1926年。现在我看到的NoClassDefFoundError在几乎每一个应用程序,我也看到了一个日志文件此消息:

2011-12-12 18:38:36,225 ERROR [TP-Processor3] [rplansecurity] org.jasig.cas.client.validation.Cas20ServiceTicketValidator java.net.SocketException: Too many open files 
java.net.SocketException: Too many open files 
    at java.net.Socket.createImpl(Socket.java:397) ~[na:1.6.0_24] 

我做了正确的Tomcat一样的,但是失败也是。所以这两台机器似乎没有区别:两者似乎都打开了太多的文件。

+0

您正在使用哪个JDK? Oracle或OpenJDK或GCJ? GCJ很麻烦。 – BalusC

+0

你确定这个jar在启动tomcat时在JVM类路径中吗?尝试“ps -ef | grep'tomcat'”,甚至连接visualVM/jconsole以查看类路径。这是很好,你有一个相同的应用程序工作。你所要做的就是比较两个类路径 – dimitrisli

+0

@BalusC我正在使用Oracle JDK。 –

回答

4

超过最大打开文件数是我的第一个想法。我也认为'ulimit -n'显示每个用户的最大文件句柄,而不是每个进程,但我可能是错的。请记住,Tomcat也可能在不同的用户下运行。

我会试着用'-verbose:class'来启动tomcat来查看哪些类以及从哪里加载来试图查看是否存在任何类型的模式。

+0

通过切换到Tomcat用户,我看到'ulimit -n'显示了相同的结果:1024.使用'-verbose:class'选项启动Tomcat时,我看到大量类正在加载,但没有失败消息。 –

+0

用'ulimit -n 4096'增加文件限制似乎有所帮助。我重新启动Tomcat,并在浏览器中立即打开所有应用程序,而不会丢失一个类。 'lsof的-p 的输出|厕所-l'上升到3305,然后下降到650 –

+0

酷,所以我的分析是正确的呢。你可以添加呼叫到ulimit到catalina.sh脚本 – maximdim