我有两个配置看似相同的虚拟机(从相同的VM模板创建,并且差异化Tomcat文件夹与主机名配置没有区别)。在两台计算机上,都部署了相同的Web应用程序。
一台机器工作正常。在另一台机器上,我收到错误,因为找不到类。我重新启动了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
)都与需要它的类位于同一个jar中(例如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知识,我设法执行了一些在互联网上发现的命令,告诉我
cat /proc/sys/fs/file-max
),cat /proc/sys/fs/file-nr
),ulimit -n
),lsof -p <TOMCAT-PID> | wc -l
)。更新:我重新启动了失败的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 :(得分:4)
超出打开文件的最大数量是我的第一个想法。我还认为'ulimit -n'显示每个用户的最大文件句柄而不是每个进程,但我可能错了。请记住,Tomcat也可能在不同的用户下运行。
我会尝试使用'-verbose:class'启动tomcat,以查看哪些类以及从哪里加载以尝试查看是否存在任何类型的模式。