私のマシンで開始するすべてのJavaプロセスには、デフォルトで2つのガベージコレクターがあるようです。JConsoleで確認しています。
例-現在実行中のEclipseの場合。
Collection Count - 221
Collection Time - 102118
Memory Pool Names - java.lang.String[4]
Collection Count - 241
Collection Time - 2428
Memory Pool Names - java.lang.String[2]
プールが重複していると思います。同じプール(エデン、サバイバー、古い世代)を使用する場合、2つのガベージコレクターはどのように連携しますか?プール間のオブジェクトの移動に重複はありませんか(2番目のアルゴリズムが呼び出されたときの1つの生存者から別の生存者への移動のように)?そうでない場合でも、プールごとに複数のコレクターが必要なのはなぜですか?
GCに関するこの記事を読みました。メジャーGCとマイナーGCが異なるために異なるコレクターを使用することについて言及していますが、同じプールで複数のコレクターを使用することについての言及はないようです。
プールが重複していると思います。
この仮定は間違っています。PS Scavengeは若い(eden、survivor)世代で使用され、PS MarkSweepは古い世代で使用されます。唯一の「重複」とは、PS Scavengeがオブジェクトを古い世代に移動し、PS MarkSweepがそれらを処理できるようにすることです。
異なるプールに異なるガベージコレクターを用意する利点は、Edenプール内のオブジェクトに対して適切に機能するアルゴリズムが、古い世代のオブジェクトに対して必ずしも適切に機能するとは限らないことです。
この記事では、さまざまなガベージコレクターが連携して動作するためのさまざまなオプションについて説明します。
オブジェクトを古い世代に移動するスペースがないときに発生する「主要な」コレクションに関する限り、Sunのこの(明らかに古い)ホワイトペーパーは次のように述べています。
...若い世代の収集アルゴリズムは実行されません。代わりに、古い世代の収集アルゴリズムがヒープ全体で使用されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加