Java 6在JDK,JVM或者同时在两者中的性能都得到了改善吗?

时间:2020-03-06 14:21:35  来源:igfitidea点击:

我一直想知道Java SE 6中吹捧的性能改进是在编译器中还是在运行时中?换句话说,由JDK 6编译的Java 5应用程序是否可以在JSE 5下运行(表示改进了编译器的优化)?由JDK 5编译的Java 5应用程序是否可以在JSE 6下运行(表示改进了运行时优化)?

我已经注意到,对于完全相同的代码库,在JDK 6下进行编译所需的时间几乎是在JDK 5下进行的两倍。我希望至少有一些额外的时间花在了编译器优化上,希望能带来更高性能的JAR和WAR。 Sun的JDK信息并没有真正详细说明它们已经实现的性能改进,我认为这只是A列中的一些,而B列中的一些,但是我想知道哪个影响更大。有谁知道在JDK 6和JDK 5上完成的基准测试吗?

解决方案

它几乎100%的运行时间。尽管有一些基本的编译技巧可以将其纳入Java编译器本身,但我认为Java 1.5和1.6之间没有任何重大改进。

新的Java虚拟机中进行了许多新的改进和优化。因此,我们将看到的主要性能提高是在版本为6的jvm上运行Java时。

使用Java 6 JDK编译旧的Java代码可能会产生更有效的代码,但是主要的改进在于虚拟机,至少我已经注意到了。

我还没有听说过编译器方面的改进,但是已经发布了有关运行时性能改进的大量信息。

迁移指南:

[http://java.sun.com/javase/6/webnotes/adoption/adoptionguide.html]

性能白皮书:

[http://java.sun.com/performance/reference/whitepapers/6_performance.html]

从Java源代码编译为字节码的javac几乎没有优化。确实,优化通常会使代码变得更慢,因为难以分析以进行后续优化。

为1.5和1.6生成的代码之间唯一的显着区别是,使用-target 1.6时,会添加有关堆栈状态的额外信息,以使验证更加容易和快捷(Java ME也是如此)。这只会影响类的加载速度。

真正的优化部分是将字节码编译为本地代码的热点编译器。在某些更新版本中甚至对此进行了更新。在Windows上,默认情况下,JRE仅分发较慢的客户端C1版本的热点。服务器C2热点运行速度更快(在java命令行上使用-server),但是启动速度较慢,并且使用了更多的内存。

此外,库和工具(包括javac)有时也会完成优化工作。

我不知道为什么我们会发现JDK 6的编译代码比JDK 5慢。