web-dev-qa-db-ja.com

OpenJDKとOracleの間にパフォーマンスの違いはありますか?

Oracleは最近、JVMの商用利用に対する課金を開始することを決定しました。

私たちのチームは代わりにOpenJDKの使用に切り替え始めており、パフォーマンスが低下していることを除いて、すべてが正常に動作しているように見えます。

サーバーはLinuxサーバーであり、パフォーマンスチームによると、

ほとんどのJava呼び出しで大幅な速度低下が見られました。ログを確認し、いくつかの呼び出しを調査しましたが、例外やエラーは見られず、速度が低下しているだけです。

OpenJDKが平均してOracle JVMよりも遅いという、これが真実であるかどうかについて他の誰かがデータを持っていますか?

ANSWER:私たちにとって、問題はUbuntuのhaproxyとOpenJDKに関係していると判断されました。これら3つを組み合わせると、すべてのソケットでさらに5ミリ秒の遅延が発生します接続。これら3つの要因のいずれかを変更すると、パフォーマンスが回復しました。

これも回答として投稿するので、両方の場所で見つけることができます

4
Brad Parks

オラクルのブログ投稿 からのこの抜粋は興味深いでしょう:

[〜#〜] q [〜#〜]:OpenJDKリポジトリで見つかったソースコードと、使用するコードの違いは何ですかOracle JDKをビルドしますか?

[〜#〜] a [〜#〜]:非常に近いです-Oracle JDKリリースのビルドプロセスは、OpenJDK 7でビルドするだけで、 JavaプラグインとJava WebStartのOracleの実装、およびいくつかのクローズドソースのサードパーティコンポーネントなど)グラフィックラスタライザ、Rhinoなどのいくつかのオープンソースサードパーティコンポーネント、および追加のドキュメントやサードパーティフォントなど、あちこちにいくつかの要素があります。今後の目的は、Oracle JDKのすべての要素をオープンソースにすることです。 JRockit Mission Control(Oracle JDKではまだ利用できません)などの商用機能を検討し、障害のあるサードパーティコンポーネントをオープンソースの代替手段に置き換えて、コードベース間の同等性を高めます。

Oracleが両方の作成を担当しているため、クライアントが支払いの正当な理由を持つことは確実であり、パフォーマンスは明白な手段です。

OpenJDKはインタープリター専用のJVMだと思います。アーキテクチャ固有のアセンブリコードがないため、これは移植が簡単ですが、残念ながらパフォーマンスが低下します。

OracleJDKは、プラットフォームの浮動小数点ABI(RP1のソフトフロートおよびRP2のハードフロート)を利用していると思います。また、高速化するために、プラットフォーム固有のコードが含まれている場合もあります。

JIT(ジャストインタイム)コンパイラ は、Sharkという名前で両方に含まれていましたが、OpenJDKに含まれているかどうかはわかりません。 Wikipedia OpenJDK はJITについて言及しておらず、私はこの古い厄介な問題を発見しました Sharkコンパイラーの削除 。ただし、 Wikipedia Javaバージョン履歴 にはJITが含まれています。

現在、OracleJDKにプラットフォーム固有のJITコンパイラが含まれているが、OpenJDKには含まれていない場合、それはパフォーマンスの違いをよく説明している可能性があります。

3
harrymc

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/ 。メモリ管理とクラスデータの共有も、異なるパフォーマンス特性の理由である可能性があります。

1
marcus

私たちにとって、問題はhaproxyUbuntuOpenJDKに関係があると判断されました。

これら3つを組み合わせると、すべてのソケット接続でさらに5ミリ秒の遅延が発生します。

これら3つの要因のいずれかを変更すると、パフォーマンスが復元されました。

私たちの特別な解決策は、haproxyロードバランサーをUbuntuの代わりにCentosを使用するように変更することでした。

0
Brad Parks