【发布时间】:2017-06-04 19:13:26
【问题描述】:
我继承了一个 SpringBoot 应用程序,该应用程序最初使用 Spring Boot 1.3(嵌入式 Tomcat)运行,使用 java -jar project.war 命令启动该应用程序。
自从我们升级到 Spring boot 1.4 后,我们注意到与在 IDE(Eclipse 和 IntelliJ)中运行应用程序相比,它的启动速度要慢得多,搜索时的延迟也更长。
一个很好的例子是搜索“SMITH”。当我们在 IDE 中运行应用程序时,搜索大约需要 5-6 秒。使用完全相同的代码库、嵌入式服务器配置和主机 - 使用 java -jar project.war 开始搜索“SMITH”时需要 14 秒。
我们已经向上、向下和向后分析了应用程序,但仍然无法弄清楚为什么它在我们的 IDE 中运行得这么快。
要解决上述问题,我们必须执行以下操作:
- 将战争扩展到临时目录
- cd 到 WEB-INF 目录
- 运行
java -classpath "lib\:classes\:lib\*.jar" my.package.Main
为什么这两个命令行功能有如此大的差异?为 Java 提供类路径真的能大幅提升性能吗?
================================================ =========================== 编辑:我已经向 Spring 提交了 https://github.com/spring-projects/spring-boot/issues/8046,这基本上是从这里剪切和粘贴
编辑 2:如果您遇到此问题并且可以共享您的代码,请使用 Spring 这样做(使用上面的链接);我公司的环境已被锁定。
【问题讨论】:
-
让我找到一些来源,但直觉上,我认为这可能与类路径的加载方式有关。我知道当我是 C# 开发人员时,我们过去常常手动检查并触摸程序集以在应用程序出现之前预加载它们,因为当你第一次加载功能时会有非常明显的延迟。如果从 .war 文件运行两次相同的搜索,是否会得到相同的延迟?
-
@HeadBangingSloth,我们有一个缓存框架可以防止这种延迟。如果我们删除了那个框架,那么是的,滞后仍然存在。不过我同意,它必须是某种类路径问题。
-
我们不可能确定发生了什么,而且我们想出一个示例项目来说明您的确切性能问题也不太容易。我会强烈鼓励您与您的主管交谈,让他们相信这个错误可能存在于您赖以交付企业解决方案的框架中,并且维护人员需要 一些 项目来重现您所看到的症状才能解决此问题。
-
除此之外,您提到您对其进行了分析。您是否在 IDE 和服务器之间对此进行了分析?您是否直接在服务器上运行探查器?也许这些配置文件快照会很有用(在 Spring 方面);如果大量调用和占用的时间都在 Spring 代码中,那么它们可能会更好地了解发生了什么。
-
@Makoto - 是的,我们分析了我们的本地机器和运行应用程序的服务器。两种环境之间没有可以帮助我们的区别因素。我已经让我的管理层知道可能的框架问题,但是我怀疑他们会提供一种方法让它离开他们的 Intranet。他们对我们提出的变通方案感到非常满意......
标签: java performance spring-boot command-line app-startup