【问题标题】:How do "modern JVMs" differ from older JVMs?“现代 JVM”与旧 JVM 有何不同?
【发布时间】:2010-12-30 12:41:52
【问题描述】:

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

“这对现代 JVM 来说不是问题。”

这通常会在有关整体性能或优化策略的讨论中出现。然而,它总是被视为一种神奇的最终答案,好像它使问题不再值得思考。这让我想知道:原型“现代 JVM”和旧 JVM 之间有什么区别,真的吗?

【问题讨论】:

  • 二进制文件上的日期戳:-P
  • @TofuBeer:谢谢你,Obvious 船长。正确而简洁,所以+1/接受。哦等等……
  • 更详细地解释垃圾收集位的相关问题:stackoverflow.com/questions/2931170/…

标签: java jvm history


【解决方案1】:

JVM 技术最显着的改进是 JIT:Just In Time 编译器。 JIT 会在代码运行时对其进行优化,从而产生巨大的性能提升,从而使 Java(至少在某些领域)能够与 C/C++ 程序竞争。

关于动态优化(代码运行时)与静态优化(编译期间)的好处的有趣讨论可以在 Steve Yegge 的演讲中找到:http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html(顺便说一句,这本身就很有趣)。

与 JIT 不完全无关的其他 JVM 改进是更快地分派虚拟方法,包括类方法和接口方法。

【讨论】:

    【解决方案2】:

    无竞争的同步过去很慢。
    垃圾收集变得更快了。
    热点优化变得更好。
    一些非常老的 JVM 只拥有 green threads

    【讨论】:

    • 我想说的是,“现代 JVM”更像是对 proto-JVM 性能不佳的陈述,而不是对当前一代的陈述
    【解决方案3】:

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

    • 可以根据预期使用情况生成具有优化级别的机器代码(它被使用了很多,也许它会被使用得更多)。这很有帮助!
    • 可以内联对 object.getFoo() 的调用,因此方法的内容直接放在生成的代码中,无需方法调用。这可以递归地完成,并且可能导致复杂的代码被实际完成的几条指令所取代。
    • 垃圾收集得到了极大的改善。这意味着很多时间都没有花费。

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2017-05-21
      相关资源
      最近更新 更多