2013-07-16 10 views
7

GCチューニングを使用すると、リアルタイムJavaアプリケーションのパフォーマンスを向上させ、認識可能なGCの一時停止を回避できます。しかし、これは〜20 GBのヒープスペースまで有効です。ハードウェアコストのJavaリアルタイムアプリケーションの垂直スケーリング

減少は、手頃な価格のRAMのマシンでも、100ギガバイトを行いました。しかし、GCが一時停止してJavaを使用しても、50 GBのようなヒープサイズが大きければ、あなたを定期的に悪夢にさらす可能性があります。

私は、オフヒープと分散ヒープのようなオプションがあることを理解します。しかし、オフ・ヒープにはse/derializationの不利な点があり、分散ヒープでは保守コストが高くなります。さらに、分散ヒープでは、実際にはRAM(64 GBなど)を十分に活用していないため、今日では一般的なものとして一般的になりつつあります。

したがって、完全にRAMの潜在能力を活用するために、Javaアプリケーションの垂直スケーリングのための良い解決策は何ですか?

+2

である「Javaのリアルタイムアプリケーション」<= WUT笑?本当にリアルタイムアプリケーションにはJavaを使用すべきではありません。それは単にそれのために作られていません。 –

+2

@stonedsquirrel - これはjvmのかなり狭い見方です。リアルタイムアプリケーションを対象としたjvmsがあります。 – jtahlborn

+0

私はあなたが "汎用目的"をかなり目標としているoracle jvmを参照していると仮定します。 azulのような巨大なメモリ用に特別に設計されたjvmsを見ましたか? – jtahlborn

答えて

5

私はBananaと呼ばれる原始的なコレクションライブラリに取り組んでいます。バナナはそれらの正確な問題に取り組んでいます これは、N個のオブジェクトを保持するオーバーヘッドなしに、すぐにLinkedLists、HashMapsなどのデータ構造をサポートします。基本的には、記憶域全体がint []配列(または多数)の内部にあることができます。

私はまだ正式にリリースされませんでしたが、そのほとんどは十分にテストされ、私はすでに任意のGC一時停止することなく、高速かつ安定した性能を維持し、RAMの144ギガバイトを持つサーバー上で正常に走ってきました。

thisハッシュマップベンチマークをチェックして、バナナを使用してデータを格納する方法と垂直方向にどれだけスケーリングできるかを確認します。

https://github.com/omry/banana/wiki/Long-to-fixed-size-object-benchmark

詳細はwikiを参照してください。

+0

入力いただきありがとうございます。それを通過します。これは無料で使用できますか、商用利用のためのライセンスがあります。 – sky

+0

はBanana(BSDライセンス)のように無料です。 –

+0

私は基本的にはそれが使用されていることを見たいと思っています。そして、これが本当に素晴らしいと思っていることをユーザから確かめてください。また、バグレポートやコードの貢献などの一般的なオープンソースの良さもあります。 –

0

ガーベジコレクション時間は、ヒープ内のライブオブジェクトの数の関数です。これは、割り当て率が非常に高いがライブオブジェクトの数が常に低い場合、大幅な一時停止をせずに、必要なだけRAMを使用できることを意味します。

この文では、スループットコレクタ(-XX:+UseParallelOldGC)と特にそうです。

あなたはCMSを使用する場合、あなたはおそらく、そのインクリメンタルモード(-XX:+CMSIncrementalMode)をチェックしたいです。ハードウェアを活用しながらSTWを一時停止することなく、ヒープのより小さな部分をクリーニングするために、より小さなCMSサイクルがトリガされます。

CMSがオプションでない場合は、大きなヒープ用に設計された新しいガベージコレクタであるG1(-XX:+UseG1GC)を参照する必要があります。原則は、各サイクルでヒープのいくつかの領域のみをクリーニングしますが、これらの領域には多くのデッドオブジェクト(クイックゲイン)が含まれていることを確認します。

希望に役立ちます!

出典:

0

私はJVMのヒープサイズをスケール上のいくつかの研究をしました。詳細はherehereです。

主な結論:若いGCの休止には、定数と可変の2つの成分があります。

定数コンポーネントは古いスペースサイズに依存し、64GiBの場合、80ms-120ms(ハードウェアに依存します)と予想されます。

可変要素は、若い空間のオブジェクトの存続に依存します(したがって、コレクションからコレクションに変化します)。これは実際にアプリケーション固有のものですが、通常は若いスペースを減らすことで減らすことができます(頻繁な休止を犠牲にして)。

あなたのケースでは、若いスペースの4GiBには500msがあります。変数の成分が400msであると仮定すると、若い空間を1 GiBに減らすと〜200msの休止時間が必要です(しかし、1秒あたり2回)。

もう1つのアプローチは、より多くのCPUコアを使用することです。若いGCと並列するのはextremely wellです。

0

G1とShenandoah(実験的)ガベージコレクタは、現在の負荷に応じてメモリ使用を最適化するJavaアプリケーションに対して大きな弾力性と垂直スケーリングを提供します。それがどのように動作するか、より具体的には、物品Minimize Java Memory Usage with the Right Garbage Collector

Java Elastic in Containers