2012-05-03 7 views
3

私の作業環境では、Windows Server 2008ハードウェア上で実行されるいくつかのエンタープライズJavaアプリケーションがあります。外部コンサルタントがJavaアプリケーションのパフォーマンスを見直しており、初期値と最大値を同一にすることを提案しています。Java初期値と最大メモリを同じ値に設定するパフォーマンス

現在、私たちは1GBの初期メモリと2GBの最大メモリを持つアプリケーションを実行しています。初期メモリと最大メモリの両方を2GBに変更することをお勧めします。 2ギガバイトの初期と最大値を割り当てることにより

彼らの推論が2倍である...

  1. は、Javaアプリケーションの起動時には、まっすぐに2GBのメモリブロックをつかむだろう。これにより、他のアプリケーションがこのメモリブロックにアクセスするのを防ぐので、このメモリは常にJavaアプリケーションで使用できます。これは現在の状況とは対照的です。最初のブロックが1GBしかないため、他のアプリケーションがサーバー上の残りのメモリを消費する可能性があり、エンタープライズJavaアプリケーションが2GBのメモリに拡張できない可能性があります。最大。
  2. Javaが初期サイズと最大サイズの間でメモリを割り当てる必要があるたびに、パフォーマンスが低下します。これは、Windowsに移動し、必要なサイズの新しいブロックを割り当ててから使用する必要があるためです。このパフォーマンス・ヒットは、初期サイズと最大サイズの間にメモリが必要になるたびに発生します。したがって、両方を同じ値に設定すると、このパフォーマンスの影響が取り除かれます。

私の最初の点は安全性の観点からは有効だと思います。なぜなら、Javaアプリケーションはサーバー上で他のアプリケーションが何をしているかにかかわらず常に最大メモリにアクセスできるからです。しかし、他のアプリケーションでは使用できない大きなメモリブロックが存在するため、一般的なサーバーのパフォーマンス上の問題を引き起こす可能性があるため、これは否定できないとも考えています。

ポイント2で議論したパフォーマンスの影響はおそらく無視できるほど小さいと思います。彼らがパフォーマンスを心配しているならば、メモリブロックを割り当てることによるパフォーマンスへの影響を心配するのではなく、Javaのガベージコレクションのようなものを調整する方が良いでしょう。

誰でも、初期値と最大値を同じ値に割り当てることができるかどうかを教えてください。いずれかの一般的な推奨事項はありますか?

答えて

3

それらを同じ増加予測可能性に設定します。 GCがより多くのメモリを必要とすると判断したときにそれらを同じに設定しないと、オブジェクトを配置しシャッフルして部屋を作るのに時間がかかります。これはGC活動に加えて行われます。これが起こっている間に要求が遅くなり、スループットが低下します。 2GBのヒープ上では、おそらくメモリが必要なくなるたびに100MBが削除され、必要になる度に約400MBのメモリが割り当てられます。ヒープサイズを大きくすると、これらの数値が増加します。ヒープはあなたの値の間で絶えず変化しているでしょう。単にメモリを割り当てて保持するようなものではありません。

OSが常にあなたのために利用可能なメモリを確保していることについての議論#1については、私は疑念があると信じています。サーバーがメモリを傷つけていて、既にソフトウェアを実行するためにマシンをキャッピングしている場合は、間違ったサーバー上で実行しています。必要なハードウェアを手に入れ、成長の余地を与えてください。あなたのアプリケーションが2GBを使うことができると言うなら、私は4GB以上の空きがあるマシンでそれを個人的に持っています。私のクライアント/ユーザーベースが増えれば、新しいユーザーに対応するためにヒープを増やすことが自由です。

3

IMOでも、第1の提案はそれほど重要ではありません。最新のOSには仮想メモリがあります。したがって、Javaプロセスに2GBのメモリを割り当てたとしても、これらの2GBのメモリは常に物理メモリに常駐するとは限りません。メモリを大量に消費する同じボックスに他のアプリケーションがあると、メモリを割り当ててもパフォーマンスが低下します。

2

2番目のポイントは非常に有効です。メモリを取得することは、IO動作が遅いことです。特に大きなチャンク。しかし、2GBは大きなブロックです。これをどのようなハードウェアで実行していますか?それはかなりのメモリを持っている場合、それは良いアイデアだろう。

あなたのコンピュータは実際にはたくさんのメモリを持っていないと言えますが、2GBのブロックを割り当てることは危険で貪欲になる可能性があります。代わりに、オブジェクトプーリングスキームを作成する必要があります。覚えておいてください。ガベージコレクタはメモリを取り、独自のメモリプールを行いますが、2GBの場合は、メモリがOSに解放される可能性があります。

何らかのプロファイリングを行うと、メモリを浪費せず、常にメモリを割り当てることによって、どれくらいの時間を節約できるのか驚くでしょう。ガベージコレクタは多くのものか​​らあなたを守りますが、2GBのブロックではそれほど多くはありません。

最終的には、可能であれば... LESSメモリの使用を検討する必要があります。 REALのパフォーマンスを得るには、キャッシュにバッファとアレイを保持してください。これはもう少し複雑ですが、膨大な結果が得られます。あなたはJVMを起動すると、それはあなたが初期サイズを設定するかどうかを一つの連続ブロックとして最大ヒープサイズをつかむ運

1

ベスト。使用量は用途によって異なります。最初のサイズが2Gのhello worldは2Gを使用しません。初期サイズは、初期サイズに達するまで使用を制限しません。 (ただし、実際には必要ない場合はメインメモリを割り当てません)

起動時の設定を改善することができます。とにかくJVMが大きくなるサイズに初期サイズを設定する傾向があります(または起動時間が短い場合は気にしないでください)

小さなヒープサイズのため一時的なオブジェクトがクリーンアップするのに高価です。ヒープサイズが大きくなると、一時オブジェクトは何度もコピーされる前に破棄され、完全なgcで削除されます。

+0

あなたは、若い世代と終身者の比率を制御できます。より小さなヒープは小さな若い世代を意味する必要はありません。ほとんどの短命オブジェクトを作成するアプリケーションがある場合、簡単に50%+若い世代に行くことができます。 (これは一般的に私がサーバをセットアップする方法です) – bestsss

+0

本当に、私は大きなエデンスペース(約4 - 16 GB)を設定し、それ以外のものは約1 - 2 GBのままにします。私が1日に16 GB以下のゴミを生産した場合、その日中にマイナーなGCをすることは避けることができます。 –

+0

オハイオ州はまったく異なるアプローチです:)。通常の負荷(1500 simult。ユーザー)での通常の割り当て速度は250 + MB/sになります。私はそれがゴミを避けるか、単にそれを抱いていると思う。キーは、中程度の寿命のオブジェクトを避けることです。 – bestsss

関連する問題