ClassNotFoundException Error in Tomcat 5.5 and Tomcat 6.0

泪湿孤枕 提交于 2019-12-23 08:37:12

问题


I am having this strange issue with the tomcat 5.5 and tomcat 6.0 servers. I have two web applications which will be installed on tomcat.When tomcat is started these two web applications also get started simultaneously but sometimes one web application fails to initialize because of the init failure in one application another application is getting classnotfoundexception errors while running. In tomcat 7.0 the application is running fine even if the other application failed to initialize.

After some debugging i came to know there is one jar named crystal.jar which is in the web-inf/lib folder of both applications. I have moved the jar to common/lib folder of tomcat then it started working fine. I want to know why it is working fine in tomcat 7.0 not in tomcat 5.x and tomcat 6.x versions. Is there any change in classloading architecture between these versions ?

Thanks

EDIT1: The library was in the location of both the applications WEB-INF\lib directory and they have no dependency with the external DLLS. Just now i read about tomcat 5.5 classloader architecture and came to know that every web application have its own class loader. The libraries in WEB-INF\lib folder and classes folder will be loaded into this classloader. The libraries whichever stored under common directory will be placed into a shared classloader. Then this library should be loaded seperately in seperate class loader of web application. There by even if one web application fails to start other web application should work independently. That's why i felt strange and need to investigate furthur.


回答1:


Finally Found the answer for this problem

There exist a known kind of PermGen memory leaks, when a library class is referenced by a system class and thus lives beyond its age. One example is when Java discovers a JDBC driver, or some other service and "automatically registers" it. It keeps reference to it in a system, but the class itself belongs to the web application and has to be unloaded when application stops - but cannot, because of that reference. Not all such references are easy to clear.

One typical symptom in such a case is that the first web application that relies on this system feature will succeed, but the second and other ones will fail (because the service that is registered in the system belongs to first web application and cannot see classes from classloader of the second application and vice versa).

Tomcat 7 and recent versions of Tomcat 6 have better protection against certain known PermGen memory leaks in their default configuration.

Tomcat 5.5 does not have such protection at all.

EDIT Some references

http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

http://eclipse.org/mat/

http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics http://wiki.apache.org/tomcat/MemoryLeakProtection



来源:https://stackoverflow.com/questions/10937935/classnotfoundexception-error-in-tomcat-5-5-and-tomcat-6-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!