1. ホーム
  2. java

[解決済み] java -server" と "java -client "の本当の違い?

2022-03-23 19:30:05

質問

java -serverとjava -clientの間に実用的な差はありますか?

サンのサイトでは、曖昧な表現しか見当たりません。

<ブロッククオート

サーバーの起動は遅くなりますが、高速に動作するはずです"。

実際のところ、どのような違いがあるのでしょうか? (現在JDK1.6.0_07を使用。)

解決方法は?

これは本当にリンクしています。 ホットスポット と、デフォルトの オプション値 ( Java HotSpot VM オプション ) があり、クライアントとサーバーの構成で異なります。

から 第2章 ホワイトペーパーの( Java HotSpotパフォーマンスエンジンアーキテクチャ ):

JDKには、クライアントサイドのVMと、サーバーアプリケーション用に調整されたVMの2種類があります。この2つのソリューションは、Java HotSpot ランタイム環境のコードベースを共有していますが、クライアントとサーバーの明らかにユニークなパフォーマンス特性に適した、異なるコンパイラを使用しています。この違いには、コンパイルのインライン化ポリシーやヒープのデフォルト値などが含まれます。

Server VMとClient VMは似ていますが、Server VMはピーク動作速度を最大化するために特別にチューニングされています。これは、起動時間の短さや実行時のメモリ使用量の少なさよりも、可能な限り高速な動作速度を必要とする、長時間稼働するサーバー・アプリケーションの実行を想定しています。

Client VMコンパイラは、Classic VMと以前のバージョンのJDKで使用されていたジャストインタイム(JIT)コンパイラの両方のアップグレード版として機能します。Client VMは、アプリケーションやアプレットのランタイムパフォーマンスを向上させます。Java HotSpot Client VM は、アプリケーションのスタートアップ時間とメモリフットプリントを減らすために特別にチューニングされており、特にクライアント環境に適している。一般に、クライアントシステムはGUIに適しています。

つまり、本当の違いはコンパイラレベルにもあるのです。

Client VMのコンパイラは、Server VMのコンパイラが実行する複雑な最適化の多くを実行しようとしませんが、その代わりに、コードの一部を解析してコンパイルするのに必要な時間が短くなります。これは、Client VMがより速く起動し、より小さなメモリフットプリントを必要とすることを意味します。

Server VM には、最適化 C++ コンパイラが行う最適化の多くをサポートする先進の適応型コンパイラが搭載されており、仮想メソッド呼び出し時の積極的なインライン化など、従来のコンパイラでは不可能な最適化も実現しています。これは、静的コンパイラと比較して、競争力、性能面で優位性がある。適応型最適化技術は、そのアプローチにおいて非常に柔軟であり、一般的に高度な静的解析およびコンパイル技術をも凌駕する性能を発揮します。

注意:リリースされた jdk6アップデート10 参照 更新リリースノート:1.6.0_10での変更点 ) は起動時間を改善しようとしましたが、ホットスポットオプションとは異なる理由で、より小さなカーネルで異なるパッケージングがされています。


G・デメッキ 指摘 コメントで というのは、64ビット版のJDKでは -client オプションは長年にわたって無視されています。
参照 Windows java コマンド :

-client

Java HotSpotクライアントVMを選択します。
64ビット対応のJDKでは、現在このオプションは無視され、代わりにJava Hotspot Server VMが使用されます。 .


2022: ホルガー を参照しています。 コメント JavaSE6 / サーバークラスのマシン検出 を、追加しています。

32ビットWindowsシステムのみ。 -client が無条件に選ばれることはありませんでした。
他のシステムでは、マシンが「サーバークラス」であるかどうかをチェックし、少なくとも2つのコアと少なくとも2GBのメモリを持つ場合に満たされていました。

そのため、ほとんどすべてのものが -server を、かなり長い間使ってきました。最も安いコンピュータでさえ、「サーバークラス」のマシンです。Sun/Oracleの64ビルドは、クライアントJVMを同梱してさえいませんでした。