2009-12-02 3 views
8

JarBundlerを使用してパッケージ化されたJavaアプリケーションがあります。このアプリはかなりCPU集約的です(たくさんの大きなCollection.sort()コール)。64ビットJava VMがアプリを10倍遅く実行する

MacOSでは、64ビットのJavaApplicationStubを使用すると、アプリケーションの動作が遅くなり、動作が遅くなります。このJavaApplicationStubファイルは、Java 64ビットVMを起動しています。

32ビットの古いJavaApplicationStubファイルが見つかりました。私はバンドルでそれを置き換え、アプリは10倍速く実行されます! (したがって、32ビットのVMはアプリケーションの実行時に使用されます)。

これは意味がありますか?なぜ64ビットVMはそれほど遅くなっていますか?アプリケーションを構築し、JavaApplicationStubファイルをこのようにハックすることは理にかなっていますか?

アドバイスありがとうございます。

+2

ちょうどチェックを得る結果を教えていますが、上の実行しているハードウェアは何ですか? –

+1

あなたは特にどのくらいの記憶を持っていますか?マシンが交換されている場合は、アクティビティビューアで確認してください。 –

+0

MacBook Core 2 Duo 10.5.8で実行 – craiglurey

答えて

5

64ビットJVMを実行するメリットとデメリットについてはthis postを参照してください。要約すると、ポインタ逆参照&のメモリ割り当て解除には時間がかかることがあります。また、大規模なデータ構造(32ビットではなく64ビット)を使用しているため、明示的に使用しない限り利点はありません。

また、インラインあなたが経験しているものである、64ビットへの移行時、彼らは、最大85%のパフォーマンスの低下を議論this relevant articleを参照してください。

パフォーマンスのこの減少の理由は、実際にありますメモリの増加に非常に関連しています。 Javaのカバーの下にあるメモリ参照は、WASランタイムとアプリケーションのオブジェクト内のメモリ構造のサイズを2倍にしました。残念ながら、プロセッサメモリのキャッシュサイズは同時に大きくなりませんでした。これは、より多くのメモリキャッシュミスを意味します。これは、より大きいメモリを処理するハードウェアの作業量が増え、アプリケーションのパフォーマンスが低下することを意味します。

+1

32ビットに固執するのが答えなら、これを強制する最良の方法は何ですか? JavaApplicationStubを32ビットバージョンに戻すか、別のVMパラメータで実行する必要がありますか? – craiglurey

+0

私はJavaApplicationStub/macユーザーではなく、それに関連するドキュメントを見つけることができませんでしたが、標準のSun jvmでは32ビットモードで64ビットjvmを実行するオプションはありません(http:できるだけ32ビットビルドを使用してください。 – Joel

-1

64ビットは遅くなりません。 試してください。

32と64で
public class Benchmark { 
public static void main(String args[]) { 
long time = System.currentTimeMillis(); 
for (int a = 1; a < 900000000; a++) { 
    for (int b = 1; b < 20; b++) { 
    } 
} 
long time2 = System.currentTimeMillis() - time; 
System.out.println("\nTime counter stopped: " + time2); 

}

、あなたが

関連する問題