为什么首次访问JSP文件需要更长时间才能在Google App Engine上使用?

时间:2010-03-17 18:17:34

标签: java google-app-engine

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

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

编辑:请注意,Google App Engine可能会预编译jsps。当我上传我的应用Initializing precompilation...时,我可以在控制台输出中看到。

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

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

1 个答案:

答案 0 :(得分:4)

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

我从来没有使用它,所以我无法从头顶回答,但通过在appengine-web.xml中快速浏览一下Java FAQ向我学习<precompilation-enabled>true</precompilation-enabled> 文件:

{{1}}

更新:根据appengine文档的 Performance 部分,它似乎按需启动(和关闭)JVM,这可能会导致“加载请求”。以下是you can enable precompilation on startup的摘录:

  

什么是加载请求?

     

有些请求运行速度较慢,因为App   引擎需要创建一个新的Java   虚拟机来服务   请求。我们称这种要求为   加载请求。在装载期间   请求,您的申请经历   初始化(如类加载,   JIT编译等导致的   要求延长时间。

     

对于已经缓慢的请求   接近App Engine的请求   截止日期,额外的初始化可以   把它推过截止日期,导致了   DeadlineExceededException。是什么原因导致   加载请求?

     

App Engine按需旋转JVM,所以   你可能会有几个原因   收到加载请求:

     
      
  1. 您刚刚上传了新版本的应用程序。
  2.   
  3. 您的应用程序可能无法获得任何流量。
  4.   
  5. 您的流量已经足够高,需要另外一个JVM才能扩展。
  6.         

    在课程期间你可以期待   开发您的应用程序,你   经常会遇到前两个   场景。相比之下,对于一个   生产应用甚至收到一个非常   小但稳定的交通量,   加载请求是相对的   不频繁的。

换句话说,这不能以任何编程方式解决。要么只是使用它,要么考虑使用具有完整servlet容器的专用服务器。