可执行的jar文件运行比Eclipse慢

7
当我在eclipse中运行程序时,它能够完美地工作。但是当我将其打包成可执行的jar文件并从命令行运行时,它运行得非常慢(几乎慢了五倍)。我在执行jar文件时甚至设置了-vmargs: java -Xms40m -Xmx512m -jar jarFile.jar 我的机器上没有任何旧版本的Java。我不明白我错过了什么。如何让eclipse使用相同的Java版本和vm参数运行同样的程序却更快?感谢任何帮助。

这个jar文件在执行时需要解压缩,所以会稍微慢一些,但是5倍的速度差距实在太大了。请问这个jar文件有多大?也许里面包含了一些不必要的资源。 - MOST2K2
4个回答

9

我们遇到了类似的问题,但问题出在我们在Eclipse中将Java代码导出为可运行的jar文件时选择了"将所需库包含在生成的jar中"选项。这会将所有的引用库作为jar文件放入可运行的jar文件中,每次运行时都需要解压缩。相反,我们在创建可运行的jar文件时使用了"将所需库提取到生成的jar中"选项,使得jar文件的执行速度大大提高——几乎与在Eclipse中运行代码时一样快。


昨天我们花了几个小时来找出问题,但是刚刚发现已经有人在stackoverflow上发布过这个问题了:https://dev59.com/eH7aa4cB1Zd3GeqPlhMa - JavaTec
1
我可以确认这对我的可运行JAR文件产生了巨大的影响。在Windows上,它至少运行快了20倍,一分钟对比大约20-25分钟。 - mvreijn
刚刚做了这个更改,JAR文件飞到月球了,速度超快,太棒了的技巧! - raffian
1
将所需的库复制到子文件夹中也可以正常工作。 - golimar

1
在创建可运行的jar文件时,不要勾选“将所需库打包到生成的jar文件中”,而是使用“将所需库提取到生成的jar文件中”的选项。这样可以节省很多时间。

1
你很可能经常向 System.out/System.err 打印输出(直接或通过日志记录)。Windows 终端仿真器需要渲染你的输出,而且比 Eclipse 慢。
尝试将所有输出重定向到文件或 NUL 并重新测量。

我并没有使用任何System.out语句,但我的日志文件非常庞大,你认为这是其中一个原因吗? - karthik
也许可以在Oracle JDK中使用jvisualvm来查看程序的运行时间分布情况。 - Thorbjørn Ravn Andersen

0

我遇到了相同的问题。在eclipse上运行应用程序需要5秒,而jar则需要3分钟。这是由于我导出可执行的jar文件的方式不同造成的。

eclipse中主要有两种将其导出为可运行的jar的方法。

1). 将所需库打包进jar文件

  • 这将向您的jar中添加库的实际jar文件。这样做很干净,因为它将应用程序类文件与库JAR文件分开。
  • 缺点是这会使可运行的jar表现非常慢。

2). 在生成的jar文件中提取所需库

  • 这种方法将仅从应用程序使用并包含在可运行的jar文件中的库中提取实际的类文件。 结果,您的Jar文件将包括您的应用程序类文件以及由您的应用程序使用的所有库的类文件。

  • 这种方法使可运行的jar文件的表现就像在您的eclipse IDE中运行一样。

  • 使用这种方式,我能够在没有任何延迟的情况下运行jar应用程序, 并且完成的时间与在eclipse IDE中运行一样,只需要5秒钟。


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