Oracleは最近、JVMの商用利用に対する課金を開始することを決定しました。
私たちのチームは代わりにOpenJDKの使用に切り替え始めており、パフォーマンスが低下していることを除いて、すべてが正常に動作しているように見えます。
サーバーはLinuxサーバーであり、パフォーマンスチームによると、
ほとんどのJava呼び出しで大幅な速度低下が見られました。ログを確認し、いくつかの呼び出しを調査しましたが、例外やエラーは見られず、速度が低下しているだけです。
OpenJDKが平均してOracle JVMよりも遅いという、これが真実であるかどうかについて他の誰かがデータを持っていますか?
ANSWER:私たちにとって、問題はUbuntuのhaproxy
とOpenJDKに関係していると判断されました。これら3つを組み合わせると、すべてのソケットでさらに5ミリ秒の遅延が発生します接続。これら3つの要因のいずれかを変更すると、パフォーマンスが回復しました。
これも回答として投稿するので、両方の場所で見つけることができます
オラクルのブログ投稿 からのこの抜粋は興味深いでしょう:
[〜#〜] 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には含まれていない場合、それはパフォーマンスの違いをよく説明している可能性があります。
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/ 。メモリ管理とクラスデータの共有も、異なるパフォーマンス特性の理由である可能性があります。
私たちにとって、問題はhaproxy
のUbuntu
とOpenJDK
に関係があると判断されました。
これら3つを組み合わせると、すべてのソケット接続でさらに5ミリ秒の遅延が発生します。
これら3つの要因のいずれかを変更すると、パフォーマンスが復元されました。
私たちの特別な解決策は、haproxyロードバランサーをUbuntuの代わりにCentosを使用するように変更することでした。