首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >启动时如何在JVM中预加载web应用程序类?

启动时如何在JVM中预加载web应用程序类?
EN

Stack Overflow用户
提问于 2009-03-19 21:30:49
回答 6查看 4.6K关注 0票数 4

在我们的web应用程序中,一些页面的第一次加载会占用少量但明显的额外时间,这是由于类加载造成的。在JVM启动时,是否有人有任何聪明的方法来预装web应用程序类?

更新:我们现在要做的是在db表中存储一堆(700)完整的类名。我们在启动时读取表并执行Class.forName()。它很好,但我想可能有一个更聪明的方法。我们使用分析器确定了在启动时引用的700个类。

EN

回答 6

Stack Overflow用户

发布于 2009-03-19 21:37:55

因为它是规范的一部分,所以它不是很聪明,但是当Web启动时,可以通过将load-on-startup元素添加到web.xml中的servlet定义来启动servlet

代码语言:javascript
代码运行次数:0
运行
复制
<servlet>
  <description>....</description>
  <display-name>....</display-name>
  <servlet-name>....</servlet-name>
  <servlet-class>....t</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

如果您这样做是为了一组有代表性的服务--或者仅仅是一个可以预加载所需一切的servlet --那么您将实现您的目标。

如果这还不够,例如,如果您想从JAR文件加载类,而不实际以一种有意义的方式初始化它们,如果您知道JAR文件在哪里或可以确定JAR文件在哪里,那么您可以使用类似于这个JCP论坛贴出了“包中的类”的代码或线程中的后面的一些帖子。从类列表中,您可以获得Class对象,这将帮助加载类,而不必实例化实例。

票数 2
EN

Stack Overflow用户

发布于 2009-05-21 13:48:46

您可以尝试在单个虚拟类中编写静态初始化程序代码,然后在启动时加载该类。它的静态初始化程序将创建一些导致加载其他类的关键对象(您可以递归地这样做以改进代码模块化)。我敢打赌这会更短、更简单(而且您没有DB问题需要担心)。

一种更好的方法可能是编写一个servlet,它在启动时会碰到一些缓慢加载的页面,并丢弃结果。这会迫使类加载。加载这些页面--多次--每一次都会增加所完成的即时编译量(既加快了代码的速度,又减少了JIT编译的成本)。还有其他的好处:这是一种“自我测试的动力”,它会导致一次性启动任务,而且它还可能在某种程度上使各种缓存处于初始状态。

票数 2
EN

Stack Overflow用户

发布于 2009-03-19 21:35:50

Class.forName()是我唯一能想到的东西。我当然有兴趣听到更聪明的替代方案。

另一种选择是选择一组URL,并在启动时运行一个脚本来访问这些URL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/664161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档