打包为jar时,Java反射性能下降

时间:2013-01-29 02:12:53

标签: java performance class reflection jar

我这里有一个真正的头脑。我尝试了一切,到处搜寻。它来自我继承了测试JAR的应用程序。

(它由GUI前端和执行实际检查的命令行应用程序组成.GUI通过在自身上启动新的JVM来运行命令行应用程序[java -cp“its.jar”com.different。 mainClass]。这是一个糟糕的设计,我知道,但可能是相关的。)

无论如何,这个程序包含一些嵌套在两个for循环中的反射调用。问题是当应用程序被JAR时,第一次反射调用每次迭代只需要一秒钟。但是当它从类运行时,需要几毫秒。

实际上,这意味着这个命令:

java -jar myjar.jar

需要数小时。

此命令:

java -cp "...[bunch of jars];myjar.jar" com.myclasses.main

需要几分钟。

正在测试的JAR总是一个罐子。区别仅在于测试应用程序。

非常感谢任何想法或途径。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以考虑在Eclipse TPTPYourKit等分析器下运行您的程序,并更准确地确定您的时间花在哪里。这很可能会使您在代码中出现错误,或者更不可能指向库中的错误。然后,如果您仍然无法弄明白,请在此处发布相关代码,我们可以提供帮助。

答案 1 :(得分:0)

我不知道这是否与您的问题有关,但此命令中的“-cp”参数将被忽略:

$ java -cp "...[bunch of jars]" -jar myjar.jar

“-cp”和“-jar”命令选项不能一起使用。可执行JAR文件从JAR清单中获取其类路径。

我不知道这会如何解释您所看到的症状......但它确实意味着您尝试使用可执行JAR所做的事情将无效,这可能会使您的问题无法实现。


关注

鉴于这只是问题中的一个错误......不是真正的问题......

我的建议是你使用java命令的第二种形式运行你的测试;即使用-cp选项和类路径。很难看出它如何对你的测试制度的有效性产生任何影响。

我怀疑找出性能问题的根本原因需要详细检查测试人员应用程序的作用。

答案 2 :(得分:0)

正如其他人所说,你真的需要对代码进行分析,以了解它花费时间的地方。

如果我不得不猜测,我会怀疑反射是否会导致重复查看类加载器,并且从jar文件中提取类时加载类会更慢。

但同样,这只是一种预感。您需要对其进行分析才能确定。