web-dev-qa-db-ja.com

Java -Xms初期サイズ効果

-Xmsパラメータを設定し、たとえば初期メモリを大きくすると、デフォルトの計算メモリ(私の場合はJava GC tunning: http://Java.Sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc.ergonomics.default_size )?

また、初期メモリと最大メモリの両方を同じサイズに設定することは有益ですか?

ありがとう。

28
SyBer

利点は、サイズを変更する必要があるヒープを使い果たすとパフォーマンスが低下することです。最初に64MBに設定したが、負荷がかかるアプリケーションに250MBが必要であることが判明した場合、64MB近くに達すると、JVMはより多くのヒープスペースを割り当て、一部のオブジェクトを移動し、他のブックキーピングを実行します。もちろんこれには時間がかかります。

アプリケーションに負荷がかかっている場合、すべてのリソースを実行専用にする必要があるため、この余分な作業によりアプリケーションの応答が遅くなる可能性があります。場合によっては、ヒープのサイズが変更される前にメモリが不足するとクラッシュする可能性があります。

Javaアプリを使用すると、「XmsXmxを同じ値に設定する」などの指示が表示されることがあります。これは、サイズ変更を回避するために行われます。全体として、アプリケーションは、これまでと同じ大きさのヒープで起動します。

32
Phil

リンクされた記事はそれを十分に明確に説明しています:

デフォルト値:-Xms 3670k -Xmx 64m [...]大規模なサーバーアプリケーションでは、多くの場合、これらのデフォルトで2つの問題が発生します。 1つは、初期ヒープが小さく、多くの主要なコレクションでサイズを変更する必要があるため、起動が遅いことです。もっと差し迫った問題は、デフォルトの最大ヒープサイズがほとんどのサーバーアプリケーションで不当に小さいことです。サーバーアプリケーションの経験則は次のとおりです。

  1. 一時停止に問題がない限り、仮想マシンにできるだけ多くのメモリを許可してください。多くの場合、デフォルトのサイズ(64MB)は小さすぎます。
  2. -Xmsと-Xmxを同じ値に設定すると、最も重要なサイズ決定を仮想マシンから削除することで予測可能性が向上します。ただし、選択を間違えた場合、仮想マシンはそれを補うことができません。
  3. 通常、割り当ては並列化できるため、プロセッサの数を増やすとメモリが増えます。

また、問題の この説明 に関心を持つこともできます。

6
Roman

-Xmsパラメータを設定し、たとえば初期メモリを大きくして、デフォルトで計算されたメモリを使用する利点は何ですか

初期ヒープが小さく、多くの主要なコレクションでサイズを変更する必要がある場合、起動が遅くなります。

また、初期メモリと最大メモリの両方を同じサイズに設定することは有益ですか?

設定-Xmsおよび-Xmxを同じ値にすると、予測可能性が得られます。これは、パフォーマンスチューニング中にJVMのサイズを決めるときに特に重要です。しかし、JVMは悪い決定を補うことはできません。

実稼働サーバーにも同じ値を使用する傾向があります(パフォーマンステスト中に調整されます)。

4
Pascal Thivent

アプリケーションが64 MBを超えるヒープメモリを必要とするのが正常な場合、Xmsをより大きな値に設定すると、VMは追加のメモリを要求する必要がないため、アプリケーションのパフォーマンスが多少向上します回。

実稼働システムでは、XmsとXmxを同じ適切な値に設定することを検討します。基本的には、「これはVMが取得できるヒープメモリの量であり、すぐに使用できるようにしています」と言っています。