OpenJDK 和 Oracle 之间存在性能差异吗?

OpenJDK 和 Oracle 之间存在性能差异吗?

Oracle 最近决定开始对其 JVM 的商业使用收费。

我们的团队已经开始转而使用 OpenJDK,发现一切似乎都运行良好,只是性能变慢了。

我们的服务器是 Linux 服务器,根据我们的性能团队的说法,

我们观察到大多数 Java 调用都存在显著的缓慢现象。我们查看了日志并调查了几个调用,没有发现任何异常或错误,只是速度缓慢。

是否有其他人有数据证明这是否属实,即 OpenJDK 平均比 Oracle JVM 慢?

答案:对我们来说,这个问题被确定与 Ubuntu 和 OpenJDK 有关haproxy。如果将这三个因素结合起来,我们会看到每个套接字连接都会有额外的 5 毫秒延迟。更改这三个因素中的任何一个,性能就会恢复。

我也会将此作为答案发布,以便可以在两个地方看到它

答案1

你可能会对这段摘录感兴趣 Oracle 博客文章

:OpenJDK 存储库中的源代码与您用于构建 Oracle JDK 的代码有何不同?

A:非常接近 - 我们针对 Oracle JDK 版本的构建过程基于 OpenJDK 7,只添加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 实现,以及一些闭源第三方组件,例如图形光栅化器、一些开源第三方组件,例如 Rhino,以及零零碎碎的部分,例如附加文档或第三方字体。展望未来,我们的目标是开源 Oracle JDK 的所有部分,除了那些我们认为是商业功能(例如 JRockit Mission Control,在 Oracle JDK 中尚未提供)的部分,并用开源替代方案替换受阻碍的第三方组件,以实现代码库之间的更接近。

由于 Oracle 负责创建这两​​者,因此很明显它将确保其客户有充分的付费理由,而性能是显而易见的手段。

我认为 OpenJDK 是仅解释器的 JVM。由于它没有特定于架构的汇编代码,因此移植起来更容易,但不幸的是,它的性能较差。

我认为 OracleJDK 充分利用了平台的浮点 ABI(RP1 上的软浮点和 RP2 上的硬浮点)。它可能还包含一定数量的平台特定代码,以使其运行速度更快。

AJIT(即时)编译器 曾经被包含在两者中,名为 Shark,但我不知道它是否包含在 OpenJDK 中。 维基百科 OpenJDK 没有提到 JIT,我确实发现了这个老问题 删除 Shark 编译器。 然而, 维基百科 Java 版本历史 确实包括 JIT。

如果 OracleJDK 目前包含特定于平台的 JIT 编译器,而 OpenJDK 没有,那么这很可能解释了性能上的差异,

答案2

至于Java 11,区别基本上在于安装程序、加密提供程序(签名与未签名)以及一些用于高级管理和从早期版本迁移的命令行选项,正如 Oracle 博客文章中所述:https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later

早期版本还有一些其他差异:它们有其他 2D、字体渲染、可服务性/管理和加密库,这可能会导致性能差异,如下所述:https://www.thegeekdiary.com/openjdk-vs-oracle-jdk-differences-between-openjdk-and-oracle-jdk/。内存管理和类数据共享也可能是造成不同性能特征的原因。

答案3

对于我们来说,该问题被确定为与haproxyUbuntu有关OpenJDK

如果将这 3 件事结合起来,我们会看到每个套接字连接都会有额外的 5 毫秒延迟。

改变这三个因素中的任何一个,性能就会恢复。

我们的具体解决方案是将我们的 haproxy 负载均衡器更改为使用 Centos 而不是 Ubuntu。

相关内容