【问题标题】:Why does not JAVA compile its IL into Native code right after Install? [duplicate]为什么 JAVA 没有在安装后立即将其 IL 编译为 Native 代码? [复制]
【发布时间】:2016-01-01 03:11:59
【问题描述】:

我刚刚读到C++ performance vs Java/C#

如前文所述,JIT 可以在运行时将 IL/字节码编译为本机代码。提到了成本,但没有得出结论:

JIT 的一个大问题是它不能编译所有东西:JIT 编译需要时间,所以 JIT 只会编译部分代码,而静态编译器会生成完整的原生二进制文件:对于某些程序,静态编译器将轻松胜过 JIT。

我很好奇为什么 java 在设备中安装时不会编译所有内容。

如果是这样,我们就不需要考虑编译时间带来的性能损失,并且符合不同的设备。

【问题讨论】:

  • 它没有这样做,因为它没有被定义为这样做。你的问题?
  • 这有利有弊。 JIT 编译代码的一个优点是编译器知道在编译代码时将如何使用代码。如果你提前编译它,这是不可能的(除非你从以前的运行中提供数据)
  • Java 确实控制了整个设备,您可以更改任何文件或任何 JAR,而无需使用 JVM 来执行此操作,因此它不知道进程容易出错。对于 Android,它知道您何时安装应用程序或取消日期,因此它知道要编译和更改什么。此外,就设备的启动时间而言,动态编译的成本更高。对于服务器而言,这比它可以支持的用户数量和长期效率更重要。

标签: java jvm jit


【解决方案1】:

实际上它是依赖于 JVM 的。新的 Google 的 JVM 使用 AOT:

ART 使用提前 (AOT) 编译器,在您安装应用程序时编译为机器码。

如果您问为什么以前的 Sun,现在 Oracle 的 JVM 不使用 AOT - 这是 Sun 工程师当时的选择。对于桌面 Java,(通常)没有安装允许执行 AOT 的应用程序的步骤,并且在加载时编译整个类路径太耗时了。

更多here,当然还有Google android 网站。

【讨论】:

  • AOT 缺点:可能就像您有一个应用程序,其中可能有很多代码更改、新更新、错误修复、补丁和持续部署性质。因此,您的代码必须更频繁地重新编译并获得机器代码,这成为一种开销。对于许多移动应用程序,您可能不会期望如此频繁的代码更改、修复等,因此非常稳定的代码必须一次编译并使用它。然而,考虑一个广泛使用的系统软件,具有分布式开发团队、CI/CD 等。您可以预期需要重复编译。因此,在这种情况下,JIT 是更好的选择。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 2014-12-10
  • 2016-07-11
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多