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