Java “怎么做?”;“现代JVM”;与旧的JVM不同?

Java “怎么做?”;“现代JVM”;与旧的JVM不同?,java,jvm,history,Java,Jvm,History,在高中和大学的计算机科学课上,我经常听到这样一句话: “这不是现代JVM的问题。” 通常,这会在关于总体性能或优化策略的讨论中提出。尽管如此,它一直被视为一种神奇的最终答案,似乎它使问题不再值得思考。这让我不禁要问:典型的“现代JVM”和旧JVM之间有什么区别呢?JVM技术最显著的改进是JIT:just-in-Time编译器。JIT在运行时对代码进行优化,从而产生巨大的性能增益,这使Java(至少在某些领域)与C/C++程序竞争 关于动态优化(代码运行时)与静态优化(编译期间)的好处的有趣讨论可

在高中和大学的计算机科学课上,我经常听到这样一句话:

“这不是现代JVM的问题。”


通常,这会在关于总体性能或优化策略的讨论中提出。尽管如此,它一直被视为一种神奇的最终答案,似乎它使问题不再值得思考。这让我不禁要问:典型的“现代JVM”和旧JVM之间有什么区别呢?

JVM技术最显著的改进是JIT:just-in-Time编译器。JIT在运行时对代码进行优化,从而产生巨大的性能增益,这使Java(至少在某些领域)与C/C++程序竞争

关于动态优化(代码运行时)与静态优化(编译期间)的好处的有趣讨论可以在Steve Yegge的演讲中找到:(顺便说一句,这本身就很有趣)


JVM的其他改进(与JIT并非完全无关)是更快地调度虚拟方法,包括类方法和接口方法。

无争用同步过去很慢。
垃圾收集速度大大加快。
热点优化变得更好。

一些非常旧的JVM只有一个功能。

现代JIT可以根据分析信息和从字节码派生的其他信息,积极优化机器代码:

  • 机器代码可以根据预期的使用情况生成优化级别(它被大量使用,也许会被更多地使用)。这很有帮助
  • 对object.getFoo()的调用可以内联,因此方法的内容直接放在生成的代码中,而不需要方法调用。这可以递归地完成,并且可能导致复杂代码被实际执行的少量指令替换
  • 垃圾收集有了很大的改进。这意味着很多时间没有被花掉

我想说的是,“现代JVM”与其说是关于当前一代的声明,不如说是关于原始JVM性能差的声明二进制文件上的日期戳:-P@TofuBeer:谢谢你,船长。正确且简洁,因此+1/接受。哦,等等……更详细地解释垃圾收集的相关问题: