Java 6 的性能改进是针对 JDK、JVM 还是两者?
-
01-07-2019 - |
题
我一直想知道 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 6 上进行的任何基准测试吗?JDK 5?
解决方案
我还没有听说过编译器的改进,但已经发布了有关运行时性能改进的大量信息。
迁移指南:
[http://java.sun.com/javase/6/webnotes/adoption/adoptionguide.html]
性能白皮书:
[http://java.sun.com/performance/reference/whitepapers/6_performance.html]
其他提示
javac 从 Java 源代码编译为字节码,几乎没有进行任何优化。事实上,优化通常会使代码实际上运行得更慢,因为更难分析以便以后进行优化。
1.5 和 1.6 生成的代码之间唯一显着的区别是,使用 -target 1.6 添加了有关堆栈状态的额外信息,以使验证更容易、更快(Java ME 也这样做)。这仅影响类加载速度。
真正优化的部分是把字节码编译为本机代码的热点编译器。这甚至在某些更新版本上进行了更新。在 Windows 上,默认情况下,JRE 中仅分发较慢的客户端 C1 版本的热点。服务器C2热点运行速度较快(在java命令行上使用-server),但启动速度较慢并且占用更多内存。
此外,库和工具(包括 javac)有时也会完成优化工作。
我不知道为什么您发现 JDK 6 编译代码比 JDK 5 慢。设置上有一些细微的差别吗?
其运行时间几乎是 100%。虽然一些基本的编译技巧可以融入 Java 编译器本身,但我不认为 Java 1.5 和 1.6 之间有任何重大改进。
新的java虚拟机有很多新的改进和优化。因此,您将看到性能改进的主要部分是使用版本 6 jvm 运行 java 时。
使用 Java 6 JDK 编译旧的 java 代码可能会产生更高效的代码,但主要的改进在于虚拟机,至少我注意到这一点。