18

JVM 实现有何不同(许可除外)?每个 JVM 是否都为通用处理实现类型擦除?

两者的区别在哪里:

  • JRockit
  • IBM JVM
  • 太阳虚拟机
  • 打开 JDK
  • 停电
  • 咖啡

.....用尾调用优化处理其中之一?

4

8 回答 8

18

JVM 实现在实现 JIT 编译、优化、垃圾收集、支持的平台、支持的 Java 版本等方面可能有所不同。它们都必须满足一组特性和行为,以便正确执行 Java 字节码。

正如您所指出的,主要区别往往在于许可。其他非技术差异往往在于免费/付费支持选项、与其他技术(通常是 J2EE 服务器)的集成以及对源代码的访问。

注意:虽然 J2EE 服务器在 JVM 上运行,但一些服务器集成了用于监视、分析和调整 JVM 性能的工具。

就技术差异而言,这些年来这些差异已经变得不那么重要了。曾几何时,IBM 和 JRockit JVM 的性能远远优于参考的 Sun 实现。这是由于运行时优化的类型、垃圾收集的差异以及本机代码的差异(以及各种类使用多少本机代码)存在显着差异。这些性能差异不再那么重要了。

一些 JVM 还包含或集成了诊断和监控工具。JRockit 包含一组用于监控 JVM 性能的工具。Sun 提供了各种基于 JMX 的工具,这些工具具有重叠的功能来做同样的事情。IBM Websphere 曾经为他们的整个 J2EE 应用程序服务器包含一组类似的工具(不确定他们是否仍然这样做,但我认为这仍然是正确的)......

一些开源 JVM 的性能往往会稍慢一些,因为它们是从头开始重新开发的。因此,他们还有更多的工作要做。大约 2 年前我最后一次检查,Blackdown 比 Sun JVM 慢得多(1.5x-2x?)。它也落后于支持的 Java 版本。

于 2009-04-14T14:24:44.870 回答
12

类型擦除是一个编译器函数,因此独立于 JVM。

于 2009-04-14T12:48:45.913 回答
1

JIT 编译是一些 JVM:s 没有的一件事。

于 2009-04-14T12:50:17.907 回答
1

类型擦除之类的事情是由编译器完成的,以向后兼容旧的 JVM。大多数 JVM 应该支持您需要的所有功能,但有些可能比其他的更优化。我猜 Sun JVM 可能是最快的。

于 2009-04-14T12:51:53.533 回答
1

如果 JVM 声称是 Java,它必须通过 TCK,提供大量的库存功能。

区别在于非核心的地方,比如垃圾收集、Sun JVM 中的 jconsole/visualvm、预编译等。


澄清:TCK 是虚拟机必须通过的测试套件才能正式兼容 Java。

于 2009-04-14T13:14:10.033 回答
1

Java 尚不支持尾调用优化。John Rose 正在努力将其包含在未来的版本中,并描述了该方法以及所涉及的一些问题。

于 2009-04-14T15:49:56.493 回答
1

JVM 之间的另一个区别是未记录 API 的行为。(例如 com.sun.xxx) 例如,Sun 的 JVM 和 IBM 的 JVM 在信号处理上的行为略有不同。(IBM 的 JVM 在某些情况下不允许应用程序捕获“INT”信号。)

于 2009-08-06T15:00:06.830 回答
1

JVM 就像一个虚拟机,负责加载类和字节码变量,执行代码。而 Applocaion 编程接口是包的集合。和包是类的集合。Java 程序在 JVM 安装和工作的地方执行。

于 2010-05-14T10:53:05.367 回答