应用程序性能和命令行界面(CLI)

3
我接手了一个SpringBoot应用程序,最初是使用Spring boot 1.3(内嵌Tomcat)运行的,使用java -jar project.war命令启动应用程序。自从我们升级到Spring boot 1.4后,我们发现它启动速度变慢了很多,并且在搜索时延迟更大,与在IDE中运行应用程序时相比。一个很好的例子是搜索“SMITH”。当我们在IDE中运行应用程序时,搜索大约需要5-6秒钟。使用完全相同的代码库、嵌入式服务器配置和主机机器-在使用java -jar project.war启动时搜索“SMITH”,需要14秒。
我们已经对应用程序进行了详细的分析,但仍然无法弄清楚为什么在IDE中运行得更快。
为了解决上述问题,我们必须执行以下操作:
  1. 将war文件解压到临时目录
  2. cd到WEB-INF目录
  3. 运行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
@HeadBangingSloth,我们已经有了一个缓存框架,可以防止出现延迟。如果我们移除该框架,那么延迟仍将存在。不过我同意,这一定是某种类路径问题。 - Dan
我们无法确定发生了什么,并且很可能很难为我们提供一个展示您确切性能问题的示例项目。我强烈建议您与您的上级交谈,以说服他们这个错误可能存在于您依赖于传递企业解决方案的框架中,并且维护者需要一些能够复现您看到的症状的项目才能解决此问题。 - Makoto
除此之外,你提到了你对其进行了分析。你是在IDE和服务器之间进行的分析吗?还是直接在服务器上运行了分析器?也许那些分析快照会很有用(在Spring方面);如果大量的调用和时间都花费在Spring代码中,他们可能会更好地解决问题。 - Makoto
@Makoto - 是的,我们对本地机器和应用程序运行的服务器进行了分析。两个环境之间没有可以帮助我们的区别因素。我已经让我的管理层知道可能存在的框架问题,但我怀疑他们不会提供让它离开他们的内部网络的手段。他们对我们想出的解决方法已经很满意了... - Dan
1个回答

0

在 Spring 的 Github 上发现了 这个问题。看起来打包的归档文件会比较慢(我猜测是因为需要在运行之前解压缩归档文件),但 WAR 归档文件应该定义了文档根目录,而 JAR 则没有,这基本上解释了性能差异。还有一个 StackOverflow 问题涉及 JAR 和 WAR 的区别,其中也包含了似乎支持这一点的链接。

不能百分之百确定这是否是答案,但希望至少能让其他人走上正确的轨道


1
这是关于启动时间而不是运行时的问题。问题是关于运行时性能的。 - M. Deinum
我觉得我同意Spring的人们,没有实际的代码,诊断起来有点困难。他们也有一个Gitter频道,你可能会在那里获得一些更快的反馈。 - HeadBangingSloth
@HeadBangingSloth - 我希望我能从我们公司的AWS上复制我们的代码,但这是不允许的。不幸的是,我没有时间创建一个项目来展示问题。我想它只能保持开放状态,或者等到其他人遇到这个问题时再更新。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接