对于java se,有几种jvm可用于在x86上的生产环境中运行:
ibm j9公司
oracle jrockit-http://www.oracle.com/technology/products/jrockit/index.html
Apache和谐-http://harmony.apache.org/
在OSX(如果是mac的话)中的一个,它看起来像是sun和aqua swing。
开放JDK
以及一些在服务器上运行的自定义产品:
蓝色-http://www.azulsystems.com/
谷歌应用引擎java-http://code.google.com/intl/da/appengine/docs/java/overview.html
其他平台:
sun solaris jvm—比x86具有更好的可扩展性?
(编辑)gnu编译器java版-http://gcc.gnu.org/java/ -可以在多个平台上编译为本机代码。
sunjvm与jvisualvm程序有着明显的优势,它允许运行时检查正在运行的代码。其他jvm是否有任何技术优势使其成为开发和/或生产的更好选择?
换句话说,是否有一个杀手级的工具或场景可以让任何时间/精力/金钱的投资在另一个jvm中都是值得的?
(如果它们是一个好的选择,也请建议额外的jvm)。
10条答案
按热度按时间vaj7vani1#
jrockit附带了jrockit任务控制,这是一个可以用来监视jvm和应用程序的工具套件。你可以在这里下载,它可以免费用于开发。
任务控制有许多visualvm缺少的特性,例如在线内存泄漏检测器、延迟分析器、eclipse集成、jmx.logging到文件。如果你想比较visualvm和任务控制,这里是最新版本的发行说明和文档。
puruo6ea2#
据我所知,sun的jvm和ibm的jvm的主要区别在于实际的垃圾收集器,ibm的垃圾收集器(s?)比sun的要可配置得多,而且只考虑到商业世界。此外,ibm的jvm在错误情况下可以说的远不止“我刚刚崩溃了,这里是我的堆堆”,这在ibm jvm的主要生存空间的商业世界中显然很重要。
因此,假设我没有被欺骗,我会说,ibm的jvm应该在业务软件中执行内存密集型操作时使用,这些操作依赖于攻击性的或高度可调的垃圾收集。
qkf9rpyu3#
几年前(jdk1.4),不同的JVM有不同的优势:
ibmjvm能够执行堆转储(以编程方式、在信号上或在oom上),heaproot实用程序对于跟踪内存泄漏非常有用(没有探查器那么具有侵入性)。没有其他jvm有这个。
jrockit有许多sunjvm没有的有用选项,比如并行集合。它也(远)更快(而且比sunvm更稳定)。
今天,太阳一号有这些特点,但我相信还有其他的。速度可能是其中之一。垃圾收集策略是另一个。
如果您使用的是weblogic,sunjvm中的一些bug可能会导致weblogic中的bug。在jrockit中,这些bug更有可能得到更快的解决。
siotufzp4#
您应该关注的典型特性/场景是性能和速度。
不管白皮书怎么说,最终你都需要自己做基准和决定。
我对ibm有偏见,因为我几年前在那里工作过。我个人没有处理jvm开发,但我记得jvm开发小组的重点是以下几点:
专有的垃圾收集优化。这不仅包括更快的gc,还包括更多的配置选项,比如服务器和客户端的gc。这是在sun提供类似选项之前。
jni接口的本机性能更快(x10)。这在eclipse/wsad开始流行,swt被大量使用的时候尤为重要。如果您的应用程序经常使用jni,那么我认为您有必要对ibmjdk和sunjdk进行基准测试。
稳定性和可靠性。我认为这只有在您从ibm购买商业支持时才有意义,比如服务层(websphere和db2、集群环境等)的sla。在这种情况下,只有在您使用他们的jvm时,ibm才能保证他们产品的稳定性。
关于openjdk,我建议您看看openjdk的历史。我的理解是openjdk7将与sun的jdk7几乎相同,因此性能很可能是相同的。主要的区别在于许可,以及像webstart这样的小组件。
如果您想从数据库中运行java代码(通过存储过程),那么oracle的jvm非常有用。它包括一些优化,可以帮助db在这种情况下更快地运行。
正如其他人所说,sun一直在追赶他们的竞争对手。我认为,在1.4天的时间里,这种差异要明显得多,但今天没有那么明显。关于jvisualvm,其他供应商也提供类似的工具,所以我不认为这是一个问题。
最后,还有一个指标(尽管有点争议)表明这些供应商对他们的虚拟机有多认真。这是他们发布的相关专利的数量。如果你需要说服你的老板,或者你喜欢阅读专利,这可能会很有用:)
专利检索:ibm和java-4559项专利。
专利检索:oracle和java-323。
falq053o5#
增量垃圾收集和非常小的
vsikbqxv6#
不是严格意义上的jvm,但仍然是java实现:gcj。它的优点是支持多个处理器,因此,如果您针对其中一个嵌入式处理器,gcj可能是您唯一的选择。另外,由于它是一个真正的编译器(不仅仅是jit),因此可以在嵌入式目标上节省jit编译的开销(包括内存和周期)。
pcww981p7#
早在Java1.4时代,我的团队就将IBMJVM用于在linux上运行的高容量、基于消息的系统。我们为什么要这样做?因为我们对不同的JVM进行了基准测试!jrockit实际上是最快的,但是它偶尔会崩溃,所以对于生产来说不是很好。
像往常一样,测量它!
axkjgtzd8#
ibm j9公司
这是您可以阅读或听到的关于j9的销售演讲:
ibm发布了一个用于java6的sdk。产品二进制文件可用于x86和64位amd上的linux,以及32位和64位的aix for ppc。除了支持javase6平台规范外,新的sdk还关注java虚拟机之间的数据共享、增强的诊断信息、操作系统堆栈回溯、更新的jdmpview工具、平台稳定性和性能。
有人会说ibmsdk除了速度之外还有一些优势,permgenspace的使用和扩展要比sunsdk或gcj好得多(对于客户端应用程序来说不是什么大问题,但是繁重的j2ee服务器,尤其是门户服务器,确实会引起sunjdk的心痛)。但是,根据本文对sun和ibmjvmgc的比较,内存性能主要取决于应用程序,而不是vm。
因此,尽管ibmjvm确实以其故障排除功能(比sun的jvm更高级)而闻名,但我不相信gc级别的差异。
sun的jvm比ibm有很大的优势,至少在solaris:dtrace提供商上是这样。实际上,我主要是在solaris上使用weblogic,所以sun的jvm一直是自然的选择。
甲骨文jrockit
几年前我做了一些bea/oraclejrockit的基准测试,它确实是一个快速的vm,当时它支持的堆比sun的vm更大。但它存在一些稳定性问题,不利于生产。不过,从那以后情况可能已经改变了。
Apache和谐号
我可能错了,但对我来说,harmony是由ibm捐赠的代码组成的(好处:社区正在进行维护),我真的不明白为什么我应该考虑harmony而不是IBMJ9。
苹果的jdk
我从来不用mac来制作,所以我真的无法回答。我只记得苹果需要一些时间来捆绑Java6,我不知道为什么。这也许不合理,但这让我怀疑。
开放JDK
我知道一些供应商正在为openjdk提供生产支持(例如带有rhel 5.3+的redhat,请参阅此博客),因此它可能是sun不支持的平台的一个选项。然而,除非有人能告诉我是什么让openjdk比sun的工作得更好,否则我想我会在支持的平台上安装sunjvm。
所以对我来说,选择实际上是:sun的jvm,除非我必须运行一些websphere的东西,在这种情况下,我会选择ibmj9。但老实说,我从来没有遇到过在sun的jvm上无法解决的情况,也没有遇到过可以(临时)交换到ibm的jvm的情况,所以我无法判断故障排除功能是否有那么好。但我承认,我可能对ibm的jvm缺乏了解。
whitzsjs9#
根据我自己的经验和表面价值,我看到了ibmgc设计的简单性。sun的各种各样的新gc无疑是优秀的,并提供了大量的微调选项,但即使在一些最活跃的web应用程序中,我知道它们可以处理重/攻击性的新对象,并在堆中保留大量的缓存,我很少看到gc超过1%,即使试图保持较低的占用空间。当然,我们可能会调整它更好,但有一个递减的回报。
在运行ibm的jdk的完全相同的应用程序中,我遇到了更多的挑战。特别是有固定集群的问题和必须调优-xk。
现在我可以提到ibm和sun都应该为killer jvm实现的十几个项目,但我想不包括您的问题的范围:)
irlmq6kh10#
一些应用程序,如金融和计算科学,将大大受益于十进制浮点的硬件实现。ibm已经推出了一系列处理器(power6、z9和z10大型机),它们实现了IEEE754-2008十进制浮点标准。最新的ibmjdk可以使用硬件加速
BigDecimal
s。这是一个非常边缘的例子,但是如果您手头有一个z10大型机,并且希望在java中使用它的十进制浮点单元,那么ibmjvm将是一个比sunjvm更好的选择。
--弗拉维乌西普甘