4

私は Java 7 へのアップグレードに非常に興味を持っていました (私自身の利己的なコーディング上の理由から)。ただし、遅延に非常に敏感なユーザーがいます (すべてがサブミリ秒である必要があります)。3 つの異なる JVM 間で簡単なパフォーマンス比較テストを行ったところ、Java 7 の方がはるかに遅いことがわかりました。このテストでは、いくつかの単純なメッセージをアプリケーションにプッシュしました。このテストは、数秒ごとに 1 つのメッセージをプッシュする低負荷の負荷ボリューム テストです。結果は次のとおりです (マイクロ秒単位):

 - Hotspot 6 (build 24): msgs= 23 avg= 902 
 - JRockit 6 (R28 b 29): msgs= 23 avg= 481 
 - Hotspot 7 (build 04): msgs= 34 avg=1130

Oracle の戦略は、Java 7 から JRockit と Hotspot を統合することです (したがって、JRockit 6 が利用可能な最後の製品です)。パフォーマンスが非常に悪い理由を誰かが知っていますか? (注意すべき点の1つは、コードがJava 1.6でコンパイルされたことです。それがそれを説明するかどうかはわかりません...)

更新:コメントから、これを建設的な質問にするのに十分な情報を実際に伝えることができないことがわかるため、私は自分の質問を閉じることに投票しました。コメントしてくれたすべての人に感謝します。

更新: より多くのフィードバックの後、私はより多くの情報を提供すると思いました. テストは常に新たなスタートの後に行われます。すべての因子は、各検定で同じです。変更されるのは JVM だけです。テストを複数回繰り返すと、一貫した結果が得られます。どのテスト反復でも GC は発生しませんでした。

以下は、テスト実行の 1 つのグラフ化された値です。JRockit と Hotspot 7 の両方で、最初のレイテンシ値が除外されました。JRockit には大きな最初の価値がありますが、その後すぐに最適化され、平均値に落ち着きます。Hotspot 7 は最適化に時間がかかり、平均値が JRockit ほど低くなることはありません。各データ ポイントは、TCP/IP ソケットからメッセージを読み取り、ビジネス ロジックを実行し、別のソケットにメッセージを書き込むマイクロ秒を表します。すべてのメッセージは同一であり、どのメッセージにも新しいコード パスは入力されません。

JRockit 6 と Hotspot 7 の比較

4

2 に答える 2

10

JRockit は、OpenJDK とは異なる独自の (純粋な C) コード ベースです。さまざまなガベージ コレクターと、まったく異なる JIT コンパイラが含まれています。BEA が所有していたときの大きな収益化要因の 1 つは、非商用バリアントであっても非常に高度な低レイテンシ GC でした。クリーン ルーム VM 実装として JRockit にかなりの時間が費やされてきました。コメントで述べられているように、HotSpot コード ベースにあるものを再実装することほど、マージは問題ではありません。これは迅速なプロセスとはほど遠いものであり、少なくとも JRockit 形式では、まったく到達しないものもあります。パズルのピースは、いわば、端にファイリングがないとうまく収まりません。JDK7 Hotspot は、他のこと、または同様のシステムの異なるバージョンに適していますが、失われたパフォーマンスの一部を補う可能性があります。

JRockit (または任意の JVM) の内部構造について詳しく知りたい場合は、「Oracle JRockit 決定版ガイド」を読むことを強くお勧めします。完全な開示、私はおそらく各コピーのロイヤリティで税抜きで約2ドルを受け取り、それを使用してエスプレッソを購入します. :)

于 2012-06-12T13:14:45.663 に答える
5

この質問の主な要点は、他のすべての条件 (JVM 引数を含む) が等しい場合、Java コードの同じ JAR の実行が、JRockit 6 および Hotspot 6 よりも Hotspot 7 JVM で非常に遅くなるのはなぜかということでした。

これにより、タイミングが正しく行われたかどうかについて懸念するいくつかの反応が生じました (明らかに、JVM 間で実際にこのような異なる結果が生じる可能性があるという人々の懐疑論によるものです)。数多くのテストに基づいて、測定値が正しいことに疑いの余地はありません。

私が可能だと思った潜在的な答えは次のとおりです。

  • Java 7 JVM は、Java 6 でコンパイルされたコードを、Java 7 でコンパイルされた同じコードよりも高速に実行しない
  • Java 7 を可能な限り最適化されたモードで実行するには、新しい JVM 引数が必要です。
  • 他の人が Java 7 と JRockit 6 のベンチマークを行ったところ、私と同じ結果が得られました。

実際のところ、新しい Java 7 JVM の動作はアプリと大きく異なり、他のすべての条件は同じです。唯一の解決策は、Java 7 VM に対してコードをプロファイリングして、コード内のどこが遅いかを発見することです。(そしておそらくその時点で、Java 6 JVM と Java 7 JVM の実際の違いが明らかになるでしょう)。

皆さんのコメントに感謝し、明確な分析/解決のために十分な詳細を提供できなかったことをお詫びします.

于 2012-06-07T20:20:21.753 に答える