我假设在浏览本文档后 Java 1.4 和 Java 6 之间存在巨大的性能差异。
我的问题是,当它必须运行的字节码在 1.4 中编译时,Java 6 运行时是否仍然具有魔力?
“为什么是这个问题?”的一些背景。在这里。
是的,因为大多数优化是由 JVM 在运行时完成的,所以编译器在优化方面做得很少。因此,使用旧 Java 编译器编译的代码仍将受益于新的 JVM。
但是,在编译时执行了一些优化,例如String
用StringBuilder
.
正如 Tomasz Nurkiewicz 所指出的,大部分优化是由 JIT 编译器完成的,您应该会看到在 java 6 而不是 java 1.4 上运行所带来的性能优势。但是,这并不能保证您将获得最佳结果。如果您使用较慢(较旧)的数据结构变体,您仍然可能会错过好处。例如,StringBuffer 代替 StringBuilder,Vector 代替 LinkedList,Hashtable 代替 HashMap,等等……
您还可以考虑使用 javac 的 -deprecated 标志进行编译。您可能想要替换不推荐使用的方法,因为它们通常意味着有更好的替代方法可以实现相同的目标。
java 中几乎所有的优化都发生在 jit 中,因此只依赖于运行应用程序的 jvm 版本。javac 字节码编译器只会发出最直接的字节码。我认为现阶段没有任何优化,除了使用StringBuilder
/的字符串连接StringBuffer
。
Java 6 及更高版本可以对使用目标版本 6 编译的类使用更快、更简单的字节码验证器。javac 编译器会在每个堆栈槽中创建有关数据类型的附加信息,验证器必须验证这些信息。在以前的版本中,验证者必须推断出这些更复杂的类型。此更改只会加速类的加载,并且在实际执行字节码时应该没有影响。
我认为版本 5 或 6 中字节码的另一个变化是类文件中的常量池可以引用类和接口。同样,这可能只会影响类加载。
不仅会有巨大的性能提升,而且即使在 Java 6 版本之间也存在很大差异。我在 18 个月的时间里跟踪了 Java 6 的次要版本,并看到了 15-20% 的加速。
顺便说一句,Java 7 已经发布,并且是首选的生产版本 - 您是否有理由不想使用该版本?
哦,还有最后一件事。如果您需要证明对管理的好处,那么您应该阅读大量有关 Java 应用程序性能测量的内容。我在即将于 2012 年 5 月 / 6 月发行的 Oracle 的 Java 杂志上有一篇文章,如果您需要的话,它是真正的 101。这是一个非常棘手的主题,所以你应该做大量的阅读,否则你可能会得到非常误导性的数字。