非常に大量のRAMを搭載したマシン(300GBから15TB、おそらくSGI Altix 4700マシン)でJavaアプリを実行する可能性を模索していますが、JavaのGCがどのように機能するかについて興味があります。このシナリオでは。
これには、IBMまたはJRockitのJVMの方がSunよりも適していると聞いています。この状況でのJVMパフォーマンスに関する調査やデータを知っている人はいますか?
非常に大量のRAMを搭載したマシン(300GBから15TB、おそらくSGI Altix 4700マシン)でJavaアプリを実行する可能性を模索していますが、JavaのGCがどのように機能するかについて興味があります。このシナリオでは。
これには、IBMまたはJRockitのJVMの方がSunよりも適していると聞いています。この状況でのJVMパフォーマンスに関する調査やデータを知っている人はいますか?
Sun JVM では、オプション -XX:UseConcMarkSweepGC を使用してコンカレント マーク アンド スイープ コレクタを有効にすることができます。オーバーヘッド。
そのようなマシンでVM以上のものを使用するというアドバイスは、私見では時代遅れです。実際のアプリケーションでは、多くの場合、CMS と 1 つの JVM でのパフォーマンスが向上するように、十分な共有データがあります。
問題は、単一プロセス(JVM)内で実行するかどうかです。そうした場合、問題が発生します。Java仮想マシンのチューニング、Oracle Coherenceユーザー・ガイド、および同様のドキュメントを参照してください。私が操作した経験則は、1GBを超えるヒープを回避することです。一方、512MB〜1GBのフルGCは1秒未満かかる場合があります。2〜4GBのフルGCには5秒以上かかる可能性があります。明らかに、これは多くの要因に依存しますが、話の教訓は、GCオーバーヘッドが線形にスケーリングせず、1秒の範囲に入ると、パフォーマンスが急速に低下することです。
SunのJVMを使用すると、ガベージコレクションを構成および最適化できますが、それ自体が科学です:http: //java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
ある程度の読み取りと調査が必要になる場合がありますが、そのようなマシンの場合、マシンとアプリケーション用に最適化されたGC設定がおそらく大きな違いを生みます。
5.0 以降、Hotspot JVM は人間工学として知られる概念を使用して、メモリ使用量を最適化しようとします。これは、使用可能なメモリの量だけでなく、ヒープ サイズ、世代サイズ、およびガベージ コレクション アルゴリズムに影響します。
これを読むことから始めてください。人間工学などについて説明しています。
https://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf
Java がメモリを割り当てて使用する方法について多数の記事を書いている Brian Goetz という人物もいます。
これはあなたの質問にまったく答えるものではありませんが、巨大なJavaアプリをデプロイする予定がある場合は、AzulSystemsアプライアンスを調べることに興味があるかもしれません。彼らは、最大670GBのヒープを1つまでアプリケーションに一時停止させることなくガベージコレクションを実行できると言っています。
このマシンで仮想Terracottaクラスターを実行することを検討してください。
本当のことを言えるのは SGI だけです。スーパー コンピューターは、通常のサーバーのようには動作しません。
しかし、Java は、アクセスするプロセッサーに対してメモリーがローカルである場合に最高のパフォーマンスを発揮することがわかりました。注: GC は、メモリ全体を端から端まで移動できる必要があります。これは、多くのコンピューターがくっついているような設計の場合、うまくスケーリングできないことを意味します。メモリ モジュールのサイズは 32 GB であるため、JVM をこのサイズに快適に収まるように制限すると、パフォーマンスが向上する可能性があります。
確かに、GCがどのように機能するかについての答えは、「誰が気にするか」です。;-)