JVM实现之间的差异

JVM实现在哪里不同(许可除外)? 每个JVM是否都为通用处理实现Type Erasure?

两者之间的区别在哪里:

  • JRockit的
  • IBM JVM
  • SUN JVM
  • 打开JDK
  • blackdown的
  • kaffe的

…..使用Tail-Call-Optimization处理其中一个?

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

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

注意:当J2EE服务器在JVM上运行时,某些服务器具有用于监视,分析和调整JVM性能的集成工具。

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

一些JVM还包括或集成了诊断和监视工具。 JRockit包含一组用于监视JVM性能的工具。 Sun提供了各种基于JMX的工具,这些工具具有相同的重叠function。 IBM Websphere曾经为他们的整个J2EE应用程序服务器提供了一组类似的工具(不确定它们是否仍然存在,但我认为它仍然是真的)……

一些开源JVM往往性能稍慢,因为它们已经从头开始重新开发。 因此,他们有更多的追赶。 最后我检查了大约2年前,Blackdown比Sun JVM慢得多(1.5x-2x?)。 它也支持Java版本。

类型擦除是一种编译器function ,因此与JVM无关。

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

JIT编译是一些JVM没有的东西。

如果JVM声称是Java,它必须通过TCK,提供大量的股票function。

差异在非核心位置,如垃圾收集,Sun JVM中的jconsole / visualvm,预编译等。


澄清:TCK是虚拟机必须通过的测试套件才能正式符合Java标准。

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

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

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