4

うまくいけば、これは簡単で迅速な質問です。私は最近、Netbeans で CPU 集中型の Java アプリケーションを開発しました。A* パスファインディングを毎秒数万回使用して、タイル マッチング ゲームを解決します。アプリケーションが完成し、非常に高速に実行されます (私はずっと netbeans でテストしてきました)。私は 1 秒あたり 700 回の試行を記録しました (各試行はおそらく 20 回程度のパス検索です)。プロジェクトをビルドすると、jar が作成され、これを netbeans の外部で実行できます。コマンド ライン (Windows 7) を使用し、java -jar theFile.jar を使用すると、1 秒あたり 1000 回試行されます。IDE はおそらく CPU パワーを少し使用して抑制していたので、これは理解できます (私のアプリケーションはマルチコアです。数値を設定できます。通常は 3/4 を使用するため、システムがあまり遅くなりません)。さて、紛らわしい部分です。明らかに私はしません Windows でこのアプリケーションを実行するたびに、ユーザーがコマンド ラインを使用する必要があることを望んでいません。jar をクリックするだけでよいはずです。問題は、jar ファイルをダブルクリックすると、プログラムが 1 秒間に 300 回も実行されるということです。

いったいなぜ、まったく同じプログラムを実行するこれら 3 つの方法が、他のすべてが一定であるにもかかわらず、パフォーマンスにこれほど大きな影響を与えるのでしょうか? コマンドラインで .jar を実行するためのスクリプトを作成するという私の修正ですか、それともここで何が起こっているのか分かりますか? どうもありがとう!

編集:新しい情報

コマンドでバッチファイルを作成しました: java -jar theFile.jar これを実行すると、コンソールで実行した場合と同じ速度で実行されます (つまり、1000 att/秒)。

ただし、単純な c++ プログラムで実行可能ファイルも作成しました。プログラムはほんの数行で、System("java -jar theFile.jar"); でした。そして0を返します;。信じられないことに、これは jar ファイルをダブルクリックする速度、約 300att/秒で実行されます。なんて奇妙だ!異なる IDE パラメータである可能性は十分にありますが、デフォルトのシステム パラメータを確認する方法や、この特定の jar 用に変更する方法がわかりません。

4

1 に答える 1

3

HotSpotVMのクライアントバージョンとサーバーバージョンの違いに遭遇している可能性があります。この記事から:

  • クライアントアプリケーションに通常使用されるプラットフォームでは、JDKにはJavaHotSpot™クライアントVM(クライアントVM)と呼ばれるVM実装が付属しています。クライアントVMは、起動時間とメモリフットプリントを削減するように調整されています。これは、アプリケーションの起動時に-clientコマンドラインオプションを使用して呼び出すことができます。

  • すべてのプラットフォームで、JDKにはJava HotSpot Server VM(サーバーVM)と呼ばれるJava仮想マシンの実装が付属しています。サーバーVMは、プログラムの実行速度が最大になるように設計されています。これは、アプリケーションの起動時に-serverコマンドラインオプションを使用して呼び出すことができます。

フラグを設定しない限り、ファイルをクリックするとjarクライアントVMが呼び出される可能性があると思います。この記事では、さらに詳細を説明します。-server

-clientシステムと-serverシステムの違いは何ですか?

これらの2つのシステムは異なるバイナリです。これらは基本的に、同じランタイムシステムに接続する2つの異なるコンパイラ(JIT)です。クライアントシステムは、起動時間の短縮やフットプリントの縮小が必要なアプリケーションに最適です。サーバーシステムは、全体的なパフォーマンスが最も重要なアプリケーションに最適です。一般に、クライアントシステムは、GUIなどのインタラクティブなアプリケーションに適しています。その他の違いには、コンパイルポリシー、ヒープのデフォルト、インライン化ポリシーなどがあります。

サーバーとクライアントシステムはどこで入手できますか?

クライアントシステムとサーバーシステムはどちらも、32ビットのSolarisおよびLinuxのダウンロードでダウンロードされます。32ビットWindowsの場合、JREをダウンロードすると、クライアントのみが取得されます。両方のシステムを取得するには、SDKをダウンロードする必要があります。

64ビットの場合、サーバーシステムのみが含まれます。Solarisでは、64ビットのJREは32ビットのディストリビューションの上にオーバーレイされます。ただし、LinuxとWindowsでは、完全に別個のディストリビューションです。

javaをデフォルトで-serverにします。変更できない(または変更したくない)スクリプトがたくさんあります。これを行う方法はありますか?

Java SE 5.0以降、32ビットWindowsを除いて、サーバーVMはサーバークラスのマシンで自動的に選択されます。サーバークラスのマシンの定義はリリースごとに変わる可能性があるため、リリースの定義については、適切な人間工学ドキュメントを確認してください。5.0の場合、5.0Java[tm]仮想マシンの人間工学です。

Hotspotがループをコンパイルするように、最初にループをウォームアップする必要がありますか?

HotSpotのループをウォーミングアップする必要はありません。HotSpotには、実行中の(解釈された)メソッドをコンパイルし、ループで実行されている間に置換するOnStackReplacementテクノロジーが含まれています。アプリケーションのパフォーマンスを向上させるために、一見無限の(または非常に長時間実行されている)ループをウォーミングアップするためにアプリケーションの時間を無駄にする必要はありません。

于 2013-02-28T03:15:31.067 に答える