2009-04-13 3 views

答えて

9

はい、ほとんどのJavaガベージコレクタは、必要に応じて実行するのではなく、必要に応じて実行されます。したがって、一般的に、メモリが増えるほど頻繁ではなく、ガベージコレクションが長くなります。

世代別ガベージコレクタには、settings to control the allocation of memory between the young and tenured generations.があります。これらを若い世代に使用するメモリの割合を小さくするように設定することで、若い世代の絶対サイズを、全体のヒープサイズが大きくなるのと同じに保つことができます。その後、ガベージコレクションの頻度や期間が大幅に変更されることはありませんが、キャッシングのようなアプリケーションでは長期間使用できるオブジェクトの容量が増えます。

4

一般的な答えは、ゴミが頻繁に収集されない傾向がありますが、GCの休止時間は長くなる傾向があります。

これは、すでにVMに使用可能なメモリが作業セットサイズよりも大きいと想定しています。それ以外の場合は、ガベージコレクションに多くの時間を費やしている可能性があります。

GCの特性は、使用するコレクタとJavaのバージョン、およびより高い-Xmxに加えて-Xmsを指定したかどうかによって大きく異なります。古いバージョンのJava(5以前)では、VMの初期化後に若い世代の領域のサイズが変更されませんでした。だからあなたが本当に大きな-Xmx値を指定したとしても、若い世代のサイズはまだまだ小さいので、若い世代のコレクションが頻繁に見られます。

若い世代のコレクションが発生すると、短期間のオブジェクトであっても、とにかくテナントスペースに昇格されるいくつかの「若い」オブジェクトが存在します。これは、年長の世代が死んだ若いオブジェクトでゆっくりいっぱいになり、定期的な完全なGCを必要とすることを意味します。テンポラリ世代で終わるこのようなオブジェクトの数は、若いGCの数に比例します(プログラムでは一定のアクティビティを想定しています)。したがって、若い世代のメリットは若い世代のGCが少なくなるため、若手コレクションのオブジェクトが少なくて済み、テナント世代に昇格されることです。

-Xmx(google for java gc)以外にもいくつかのチューニングパラメータがあります。アプリケーションごとに最適な設定が異なるため、実験する必要があります。

2

はい、使用しているガベージコレクタによって異なります。 GC tuning pageは、この種の質問に適したリソースです。

1

これは、より多くのメモリがある場合、収集して圧縮するために、より多くのスキャンを行うためです。これは、(完全な)GCが起動すると、より多くのメモリをスキャンしなければならず、メモリをよりコンパクトにする必要があることを意味します。多分もっと多くの文脈で私たちはさらに助けてくれるでしょう。明らかに3つの異なるセクションがスキャンされるので、必ずしも1-1の意味で直接相関するとは限りません。

1

間接的に、しばらくの間実行した後。 -Xmxは、ヒープの拡張が可能な最大サイズを設定し、初期サイズには影響しません。したがって、プログラムの実行の初期段階では、gcの時間や頻度には影響しません。 gcの後にヒープがいっぱいになると、heapsizeが増加し、これが-Xmxに影響します。 -Xmxの設定を高くすると、ヒープが大きくなり、コレクションのトリガ回数が少なくなります(また、コレクションの記述には時間がかかります)。

しかし、アプリケーションであまりにも多くのメモリを使用しない(gcの後にヒープがほとんど空になるように)ため、ヒープが大きくならず、-Mxの設定は無関係になります。

-Xmsを使用して、初期GCヒープサイズを設定できます。これはガベージコレクションに直ちに影響します。

関連する問題