JVM实现之间的差异

20

除了许可证之外,JVM实现在哪些方面有所不同?每个JVM都实现泛型处理的类型擦除吗?

以下是各个JVM之间的差异:

  • JRockit
  • IBM JVM
  • SUN JVM
  • Open JDK
  • Blackdown
  • Kaffe

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

8个回答

19

JVM的实现在JIT编译、优化、垃圾回收、支持平台和Java版本等方面可能存在差异。它们都必须符合一组特定功能和行为,以便正确地执行Java字节码。

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

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

就技术差异而言,随着时间的推移,这些差异变得不那么重要了。曾经,IBM和JRockit JVM相对于参考的Sun实现性能要好得多。这是由于运行时优化类型的显著差异、垃圾回收的差异以及本地代码的差异(以及各个类使用多少本地代码)所致。这些性能差异现在不再那么显著。

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

一些开源JVM因为重新从头开始开发而速度稍慢。因此,它们需要更多时间来赶上。在大约两年前我最后检查时,Blackdown比Sun JVM慢得多(1.5倍-2倍?),并且还落后于Java的支持版本。


作为一个被迫使用JRockit超过5年的人,我可以说总体来说它并不比Hotspot更快,但它肯定不如Hotspot稳定。他们为了速度而牺牲了可靠性,最终什么也得不到。 - erickson
@erickson,作为一个自愿使用JRockit超过5年的人,我可以说你的经历并不普遍。JRockit至少在一次内存泄漏检测工具中拯救了我。:) 我使用它时没有比Sun VMs更多的崩溃(虽然有1或2个)。 - jsight

12

1
JVM 就像一台虚拟机器,负责加载类和字节码验证器,并执行代码。而应用程序编程接口是包的集合,而包又是类的集合。Java 程序在安装并运行 JVM 的地方执行。

1

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


关于Sun JVM的情况如何?http://java.sun.com/javase/technologies/hotspot/似乎热点JIT编译器已经随着每个JVM版本的发布而发布了! - Martin K.
我不确定你想要表达什么,但是是的,Hotspot是Sun JVM的一部分。 - John Smith
你为什么说每个JVM都没有JIT编译器,当它是大多数JVM的一部分?你为什么要给我投票反对? - Martin K.
1
@abababa22: "every JVM doesn't have" 在美式英语中基本上等同于 "no JVM has"。你的意思是 "不是每个JVM都有" 吗? - Michael Myers
@mmyuers: 我觉得这正是他的意思。有一些特殊用途的工具也是如此。 - jsight
@mmyers:我当然是指“并非每个JVM都有”。我不是母语为英语的人。 - John Smith

1

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


1

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

区别在于非核心位置,如垃圾回收、Sun JVM中的jconsole/visualvm、预编译等。


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

1

Java目前还不支持尾调用优化。John Rose正在领导相关工作,计划在未来的版本中加入该功能,并描述了方法和一些涉及的问题


我记得Java6有一些选项(实验性特性),也许Sun JDK支持它作为实验性功能?那么“达芬奇虚拟机”呢?我听说它应该支持TCO! - Martin K.
是的,达芬奇项目旨在支持其他语言,并且这也是支持正在进行原型设计的地方。 - erickson
IBM JVM支持某种优化(仅限尾递归),类似于跳转到方法的开头。 - bartosz.r

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接