在我们的web应用程序中,一些页面的第一次加载会占用少量但明显的额外时间,这是由于类加载造成的。在JVM启动时,是否有人有任何聪明的方法来预装web应用程序类?
更新:我们现在要做的是在db表中存储一堆(700)完整的类名。我们在启动时读取表并执行Class.forName()。它很好,但我想可能有一个更聪明的方法。我们使用分析器确定了在启动时引用的700个类。
发布于 2009-03-19 13:37:55
因为它是规范的一部分,所以它不是很聪明,但是当Web启动时,可以通过将load-on-startup
元素添加到web.xml
中的servlet定义来启动servlet
<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对象,这将帮助加载类,而不必实例化实例。
发布于 2009-05-21 05:48:46
您可以尝试在单个虚拟类中编写静态初始化程序代码,然后在启动时加载该类。它的静态初始化程序将创建一些导致加载其他类的关键对象(您可以递归地这样做以改进代码模块化)。我敢打赌这会更短、更简单(而且您没有DB问题需要担心)。
一种更好的方法可能是编写一个servlet,它在启动时会碰到一些缓慢加载的页面,并丢弃结果。这会迫使类加载。加载这些页面--多次--每一次都会增加所完成的即时编译量(既加快了代码的速度,又减少了JIT编译的成本)。还有其他的好处:这是一种“自我测试的动力”,它会导致一次性启动任务,而且它还可能在某种程度上使各种缓存处于初始状态。
发布于 2009-03-19 13:35:50
Class.forName()是我唯一能想到的东西。我当然有兴趣听到更聪明的替代方案。
另一种选择是选择一组URL,并在启动时运行一个脚本来访问这些URL。
https://stackoverflow.com/questions/664161
复制相似问题