동일한 VM 템플릿에서 생성 된 겉보기와 동일한 구성을 가진 두 개의 가상 시스템이 있고 Tomcat 폴더를 diff'ing하면 호스트 이름 구성과 다른 점이 없습니다. 두 컴퓨터 모두 동일한 웹 응용 프로그램이 배포됩니다.Tomcat이 기존 클래스를 찾지 못함
하나의 기계가 정상적으로 작동합니다. 다른 컴퓨터에서는 클래스를 찾을 수 없으므로 오류가 발생합니다. 나는 tomcat을 3 번 재시작했고, 항상 다른 응용 프로그램에서 다른 오류를 얻습니다. 누락 된 클래스 (예 ServletRequestAttributes
) 정보 (예컨대 RequestContextListener
)을 필요로하는 클래스와 동일한 용기에 존재하는, 지금까지의 모든 에러에 선두로부터
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)
: 하나의 이러한 에러는이된다.
두 컴퓨터에서 CentOS, Apache 2.2.3, Tomcat 6.0.30 및 Oracle JDK 1.6.0_24를 사용하고 있습니다. Tomcat은 많은 양의 heap 및 perm gen 공간 (두 시스템 모두 동일)으로 구성됩니다.
이 Tomcat 6 "losing" classes in production이 비슷한 문제이지만, 지금까지 솔루션없이 것으로 보인다.
하나의 가능한 문제점은 "OS에서 열린 파일 핸들의 최대 수에 도달했을 수 있습니다."입니다. 기본적인 리눅스 지식, 나는 파일을 처리
- 최대 두 기계 (
cat /proc/sys/fs/file-max
)에 6,815,744 것을 말해 인터넷에서 발견 된 일부 명령, - 현재 사용이 실패하고 10200에서 10710입니다 실행 관리 정확한 머신 (
cat /proc/sys/fs/file-nr
)에 - 최대 파일 핸들은 프로세스 당 1,024 (
ulimit -n
) 톰캣 - 전류 사용량에 실패한 641 정확한 머신 (
lsof -p <TOMCAT-PID> | wc -l
)에 686이다.
업데이트 : 나는 실패 Tomcat을 다시 시작하고 브라우저에서 한 번에 모든 응용 프로그램을 열었습니다. 톰캣의 파일을 사용하고 내가 거의 모든 응용 프로그램에서 NoClassDefFoundError를 참조 이제 1926 년까지 가서, 나는 또한 하나 개의 로그 파일에이 메시지가 표시 :
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]
내가 올바른 톰캣에서 동일한했다, 그리고 그것은 실패 , 너무. 두 컴퓨터의 차이점은 다음과 같습니다. 둘 다 너무 많은 파일을 여는 것 같습니다.
정확히 어떤 JDK를 사용하고 있습니까? Oracle 또는 OpenJDK 또는 GCJ? GCJ는 매우 버그가 있습니다. – BalusC
바람둥이를 시작할 때이 항아리가 JVM 클래스 패스에 있는지 확인 하시겠습니까? "ps -ef | grep 'tomcat'"을 시도하거나 visualVM/jconsole과 연결하여 클래스 경로를 확인하십시오. 동일한 앱을 사용하는 것이 좋습니다. 두 클래스 패스를 비교하면됩니다. – dimitrisli
@BalusC Oracle JDK를 사용하고 있습니다. –