java - 如何在启动时在 JVM 中预加载 Web 应用程序类?

标签 java performance web-applications jvm classloader

在我们的网络应用程序中,由于类加载,某些页面的首次加载需要少量但明显的额外时间。有没有人有任何巧妙的方法在启动时在 JVM 中预加载 Web 应用程序类?


更新:我们现在所做的是在数据库表中存储一堆 (700) 个完整的类名。我们在启动时读取表格并执行 Class.forName()。它工作正常,但我认为可能有更聪明的方法。我们使用分析器确定了在启动时引用的 700 个类。

最佳答案

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

<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 文件的位置, 然后你可以使用类似于 this JCP forum post "List classes in package" 处的代码或该线程中的一些较晚的帖子。从类列表中,您可以获得 Class 对象,这将有助于加载类,而无需实际实例化实例。

关于java - 如何在启动时在 JVM 中预加载 Web 应用程序类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/664161/

相关文章:

Java乘法优化

java - 在这种情况下,为什么 Arrays.setAll 比 Arrays.parallelSetAll 更快?

python - 在运行 python 程序时,是否可以强制您的计算机投入更少的 CPU 来换取更多的时间?

java - Java编译器不断说 “error while writing className: className.class (Permission denied)”

java - 如何在 Android 中发送带有 fragment 的 graphql 查询

java - 如何从 WSDL 动态自动生成 Java Bean?

performance - Jackson 2 : Parsing a ton of classes through JPA associations, 是否可以限制深度?

c# - EntityFramework .Take() 随着时间的推移性能下降

javascript 网络应用程序开发

javascript - 共享 Angular 2 应用程序,web/mobile-web/Ionic 2