这是我的测试:我访问一个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时间。
答案 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,所以 你可能会有几个原因 收到加载请求:
- 您刚刚上传了新版本的应用程序。
- 您的应用程序可能无法获得任何流量。
- 您的流量已经足够高,需要另外一个JVM才能扩展。
醇>在课程期间你可以期待 开发您的应用程序,你 经常会遇到前两个 场景。相比之下,对于一个 生产应用甚至收到一个非常 小但稳定的交通量, 加载请求是相对的 不频繁的。
换句话说,这不能以任何编程方式解决。要么只是使用它,要么考虑使用具有完整servlet容器的专用服务器。