Hi,
We recently upgraded Tomcat from version 7 to version 8 (8.0.32 to be precise),
and we immediately noticed a deterioration in the performance. Page load time
increased from about 500ms to 2500-5000 ms.
One thing we noticed when we looked at some thread dumps, is that quite often a
ClassNotFoundException can be seen. I found that a bit interesting, because it
didn't correspond to any ClassNotFoundException in the log file. However, when
troubleshooting this I noticed that the exception is caught and ignored.
Here is an example stacktrace from one thread dump:
"http-apr-8080-exec-33" Id=282 in RUNNABLE
at java.lang.Throwable.fillInStackTrace(Native Method)
at java.lang.Throwable.fillInStackTrace(Throwable.java:783)
- locked java.lang.ClassNotFoundException@26bef633
at java.lang.Throwable.<init>(Throwable.java:287)
at java.lang.Exception.<init>(Exception.java:84)
at
java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:75)
at java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:82)
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
- locked java.lang.Object@2ca91dd5
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
- locked java.lang.Object@64a0e12a
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
- locked java.lang.Object@1b5f6952
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
- locked org.apache.catalina.loader.WebappClassLoader@254b720a
at
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at javax.el.ImportHandler.findClass(ImportHandler.java:195)
at javax.el.ImportHandler.resolveClass(ImportHandler.java:164)
at
javax.servlet.jsp.el.ScopedAttributeELResolver.getValue(ScopedAttributeELResolver.java:62)
at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46)
at org.apache.el.parser.AstNot.getValue(AstNot.java:43)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
at
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943)
at
org.apache.jsp.template.framework.common.elements.sectionText.sectionText_jsp._jspx_meth_c_005fif_005f3(sectionText_jsp.java:460)
Here is the code on line 460 in sectionText_jsp.java:
_jspx_th_c_005fif_005f3.setTest(((java.lang.Boolean)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${not empty
leadtext}", boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context,
null)).booleanValue());
And here is the corresponding line in sectionText.jsp:
<c:if test="${not empty leadtext}">
I cannot for the life of me understand how this simple EL expression can result
in a ClassNotFoundException.
Also, this problem doesn't occur just with this specific jsp file. In fact, it
seems to be a different jsp file involved each time. And it doesn't happen
every time. The fact is that in order for me to recreate the problem in my
local environment, I had to perform quite a few page requests in the browser,
and still it only happened once in a while (with different jsp file each time).
So it is very intermittent, and seems to be something happening deep down in
the core of Tomcat itself. I'm not claiming it is a Tomcat bug, it could very
well be some erroneous configuration that we are using. But the error doesn't
really seem to be related to our code base, or our third party jars.
Has anyone seen this problem before? What could be the cause of it?
Regards
/Jimi