为什么自从升级到Tomcat8之后,我的JSP应用程序速度明显变慢了



将遗留JSP应用程序从Tomcat 7/Java 7升级到Tomcat 8/Java 8后,页面响应时间明显缩短;有些页面需要4到5倍的加载时间
我在Tomcat8迁移说明的JavaServerPages2.3部分中发现了这一点:

"统一表达式语言3.0增加了对引用静态字段和方法的支持。要在jsp中支持这一功能,需要更改javax.servlet.jsp.el.ScopedAttributeELResolver实现,以便它还检查标识符,以查看它们是否是导入的类或字段的名称。在某些情况下,这一更改会引发显著的速度减慢。这会影响可能引用页面、请求、会话或应用程序范围的变量,或者可能未定义。当未定义时,解析标识符需要更长的时间,因为现在还会检查标识符是否是导入的类或字段。"

这在一定程度上解释了速度减慢的原因,因为应用程序包括许多(100个).jsp和.tag文件,其中包括对未缩放变量的引用。果不其然,在Tomcat进程上运行strace时,我可以看到类加载器试图解析这些引用,例如

第7063:27709行13:42:46.248512 stat("/opt/tomcat/webapps/App/WEB-INF/classes/java/lang/width.class",0x7f69cc9eb4f0)=-1 ENOENT(无此类文件或目录)第7075:27709行13:42:46.250092 stat("/opt/tomcat/webapps/App/WEB-INF/classes/javax/servlet/width.class",0x7f69cc9eb4f0)=-1 ENOENT(无此类文件或目录)第7085:27709行13:42:46.251337 stat("/opt/tomcat/webapps/App/WEB-INF/classes/javax/servlet/http/width.class",0x7f69cc9eb4f0)=-1 ENOENT(无此类文件或目录)第7095:27709行13:42:46.252548 stat("/opt/tomcat/webapps/App/WEB-INF/classes/javax/servlet/jsp/width.class",0x7f69cc9eb4f0)=-1 ENOENT(没有这样的文件或目录)

每次访问页面时,我都会看到这种行为。我有两个问题:

1.)有没有办法将Tomcat8配置为像Tomcat7一样处理未范围变量,这样我就不必在插入适当范围的.jsp和.tag文件中搜索100个了?

2.)为什么每次访问页面时都会发生这种情况?我理解为什么第一次发生这种情况,但一旦编译了页面,JSP引擎(Jasper)就确定了正确的范围。

如果您在此过程中更新到了SpringBoot 2.3.x,那么本文可能会对您有所帮助。

https://vivekvara.medium.com/jsp-performance-degrades-from-spring-boot-2-3-x-for-undefined-attributes-8cb434f743c2

由于某些类查找,JSP表达式语言中的未定义符号会出现这种情况。

为了避免这种减速,代码如:

${undefined}

应替换为:

${requestScope.defined}

最新更新