Java 为什么在Google应用程序引擎上首次访问JSP文件需要更长的时间?

Java 为什么在Google应用程序引擎上首次访问JSP文件需要更长的时间?,java,google-app-engine,Java,Google App Engine,这是我的测试:我访问一个servlet来加载JVM(吸收加载请求)。然后,我访问一个JSP,其中包含,没有其他内容。第一次访问此JSP使用350毫秒的CPU时间,延迟为200毫秒。后续访问的延迟和cpu时间约为20ms 为什么启动servlet容器后第一次访问jsp需要更长的时间 编辑:请注意,Google应用程序引擎应该预编译JSP。当我上传我的应用程序时,我可以在控制台输出中看到,初始化预编译… 编辑:它是对任何JSP的第一次访问,然后是后续访问,即使对不同JSP的访问不会花费很长时间。这就

这是我的测试:我访问一个servlet来加载JVM(吸收加载请求)。然后,我访问一个JSP,其中包含
,没有其他内容。第一次访问此JSP使用350毫秒的CPU时间,延迟为200毫秒。后续访问的延迟和cpu时间约为20ms

为什么启动servlet容器后第一次访问jsp需要更长的时间

编辑:请注意,Google应用程序引擎应该预编译JSP。当我上传我的应用程序时,我可以在控制台输出中看到,
初始化预编译…

编辑:它是对任何JSP的第一次访问,然后是后续访问,即使对不同JSP的访问不会花费很长时间。这就好像JSP系统有一些加载任务要做或做些什么


另外,这不是一个加载请求,我在访问JSP以吸收加载请求之前先访问一个servlet。此外,任何加载请求都不会使用少于500毫秒的CPU时间。

JSP在第一次访问/请求时被编译为扩展
HttpServlet
的类。一些servletcontainers将在启动时直接编译它(或者可以配置),这样您就不会注意到“滞后”。其他人不支持它,然后您需要自己预编译JSP文件并使用它部署WAR

我从未使用过它,所以我无法从头开始回答,但快速浏览一下它,我就知道,通过在
appengine web.xml
文件中添加以下条目:

<precompilation-enabled>true</precompilation-enabled>
true
更新:根据appengine文档的性能部分,它似乎会按需启动(和关闭)JVM,这可能会导致“加载请求”。以下是一个摘录:

什么是加载请求?

某些请求运行较慢,因为应用程序 引擎需要创建一个新的Java 虚拟机来为 要求我们把这种要求叫做, 装载请求。装货时 根据您的请求,您的申请将继续进行 初始化(如类加载、, JIT编译等)导致 请求花费更长的时间

对于已被删除的慢速请求 接近应用程序引擎的请求 截止日期,额外的初始化可以 将其推过最后期限,导致 DeadLineExceedexception。什么原因 加载请求

AppEngine按需启动JVM,所以 有几个原因可以解释为什么你会这样做 接收加载请求:

  • 您刚刚上载了应用程序的新版本
  • 您的应用程序可能没有获得任何流量
  • 您的流量已经足够高,需要另一个JVM来扩展
  • 你可以在课程中看到这一点 在开发应用程序的过程中 通常会经历前两种情况 情节。相比之下,对于 生产应用程序甚至收到了非常高的价格 交通量小但稳定, 加载请求相对较少 很少


    换句话说,这是无法以任何编程方式解决的。要么与它一起生活,要么考虑一个专用的服务器,它有一个完整的Services容器。

    谢谢,Balus,我已经预编译为真的。对,加载请求是重要的,在我的测试中,在访问JSP之前,我吸收了加载请求。还要注意,它只是第一次访问任何JSP。