Solaris(SPARC)およびLinux(RHEL 5.x)上の32ビットサーバーJVMの限界を押し広げているお客様のために、製品を64ビットJavaに移行することを検討していました。私たちのディレクターは、「数年前、64ビットは完全には存在していませんでした。今はどうですか?」と尋ねました。
Sunは、Windowsよりもはるかに長い間64ビットを実行してきました。Solaris 2.5(1995年にWindows 95がリリースされたのと同じ年)は、64ビットでは以前ほど信頼性がありませんでした。まだSunOS(32ビット)を使用している多くの人はその要点を理解しておらず、問題となるほど十分なメモリを備えたマシンはほとんどありません。Solaris 2.6(1997)では、64ビットプラットフォームへの最初の重要な移行が見られました。私は1999年(Solaris上)までJavaを真剣に使用していませんでした。その時点で、64ビットはすでに頭の中で確立されていました。
1)4 GBの境界を超えていないお客様の場合、64ビットJVMを使用すると、パフォーマンスの面で悪影響がありますか?はいの場合、いくらですか?
64ビットJVMには、2倍のサイズと2倍の数のレジスタがあります。たくさん使用long
すると劇的な改善が見られますが、一般的なアプリケーションの場合、どちらの場合も違いは5〜10%です。
たくさんのオブジェクトを作成します。
これがあなたにとって問題として認識されていなければ、IMHOパフォーマンスはあなたにとってそれほど問題ではありませんでした。任意のプロファイラーを使用すると、CPUとメモリの使用量に関する2つのレポートがあります。多くの場合、メモリプロファイルを調べると、パフォーマンスに大きな違いが生じます。(下記参照)
(32ビットと64ビットのJVMを同時にサポートすることは望ましくありません。どちらかまたは状況であることが望ましいです)大きな違いがあるとは言えません。それぞれをサポートするオーバーヘッドは何だと思いますか。コードはまったく同じです。あなたの観点からすると、テストがわずかに増える可能性があります。2つのバージョンのJava6をサポートすることと大差ありません。
2)4 GBの境界を押し上げる人にとって、JVMは32ビットと同じくらい安定していると期待できますか?
1999年以来64ビットバージョンを使用しているので、32ビットを使用することで状況が改善された(メモリが限られているために悪化するだけだった)機会を思い出せません。
パフォーマンスが問題になりますか?はいの場合、いくらですか?たくさんのオブジェクトを作成します。
パフォーマンスが問題になる場合は、破棄するオブジェクトを減らします。
どのGCチューニング技術が新しいですか?
最大メモリサイズを大きく設定できます。それについてです。32 GB未満である限り、32ビット参照を使用するため、メモリ使用量が目立って増加することはありません。
私が行うことの1つは、新しいアプリケーション用にEdenサイズを8 GBに設定し、不要な場合はサイズを小さくすることです。これにより、GC時間を大幅に短縮できます。(1日1回程度まで;)これは32ビットJVMのオプションではありません。
プロファイラー:64ビットJVMアプリのプロファイリングには十分ですか?
VisualVMは純粋なJavaであり、AFAIKはまったく同じように機能します。YourKitはネイティブライブラリを使用しており、正しいバージョンを使用していることを確認する必要がある場合があります(通常はこれを設定しますが、環境を混乱させる場合は、エージェントの2つのバージョンがあることを知っておく必要があります)
パフォーマンスが心配な場合は、それほど多くのオブジェクトを作成しないでください。実際のアプリケーションでは、オブジェクトの作成がどれほど遅くなるかに驚くかもしれません。アプリケーションの速度が2倍から10倍以上遅くなる可能性があります。コードを最適化するとき、最初に行うことはオブジェクトの破棄を減らすことであり、少なくとも3倍のパフォーマンスの向上を期待しています。
比較すると、64ビットと32ビットを使用すると、5%〜10%の違いが生じる可能性があります。それは速くても遅くてもよく、両方とも同じように可能性があります。メモリの肥大化に関しては、最新のJVMを使用してください。これは、目立たない可能性があります。これは、32 GB未満のメモリを使用する場合、64ビットJVMがデフォルトで32ビット参照を使用するためです。ヘッダーのオーバーヘッドはまだわずかに高くなりますが、オンの場合、オブジェクトは64ビットではそれほど大きくありません-XX:+UseCompressedOops
(最新リリースのデフォルト)。
Java:64ビットプログラミングのすべて
32ビットと64ビットのJVMを使用して一般的なオブジェクトのサイズをテストするJava:オブジェクトのサイズを取得する
たくさんのオブジェクトとリフレクションを作成するのと、何も作成せずに動的に生成されたコードを使用するのと同じことを行う極端な例。1000倍のパフォーマンスの向上。パフォーマンスを向上させるためのJavaシリアル化の回避
ヒープレスメモリを使用すると、GC時間を大幅に短縮できます。何百万もの要素のコレクションライブラリ
ヒープレスメモリを使用すると、アプリケーションが別のアプリケーションにデータを渡す代わりに、はるかに多くのメモリを使用できるようになります。サーバーアプリケーションは4 GBに制限する必要がありますか?