我正在诊断偶尔出现的客户问题:ClassNotFoundException
用于从JSP编译的类。大部分时间一切正常,但每隔一段时间(可能每隔几周就会有十几个节点)Tomcat无法加载特定JSP的类文件(通常只有一页,看似随机) 。该类文件存在于' work'目录。它似乎没有腐败。我可以删除它和相应的.java文件,并在下一个请求中重新创建(相同) - 但Tomcat继续报告ClassNotFoundException
。重新启动Tomcat可以解决问题。
平台详情:
我一直在挖掘Jasper JSP编译器的源代码和它用来加载这些类的JVM类加载器代码(org.apache.jasper.servlet.JasperLoader
基于java.net.URLClassLoader
)。如果我正确地阅读了代码,那么每个JSP页面都会获得相应的上下文'首次访问特定JSP时创建的对象(JspCompilationContext
/ JspServletWrapper
)。 JspCompilationContext
包含与该网页相关联的JasperLoader
。
我最好的理论是类加载器中的某些东西正在缓存对例如变为无效的文件系统inode的引用(例如,由于文件系统维护活动)。但是,我无法在类加载器代码中看到任何可能正在执行此操作的内容,并且如果重新编译JSP,则看起来应该创建新的类加载器,并且此类重新编译不能解决问题。所以,我最好的理论并不好。
不幸的是,这只是在客户现场看到的,并且无法随意重现,因此我的直接调试能力有限。因此,我正在寻找任何可能的调查机会。