24

Java のガベージ コレクションと SO Q&A について調べてきましたが、ガベージ コレクションの種類について混乱しています。

例としてスループット コレクターを見てみましょう。(別名パラレルコレクター)。ドキュメントによると、複数のスレッドを使用してマイナーコレクションを実行し、メジャーコレクションには単一のスレッドを使用します (シリアル コレクターと同じ)。

今私の質問:

  1. フル GC とはどういう意味ですか? a) マイナー コレクションとメジャー コレクションの両方が実行されることを意味しますか? または b) フル GC == メジャー コレクション? どちらですか?
  2. a) の場合、メジャーはシングルを使用して行われたのに対し、マイナー コレクションはまだ複数のスレッドを使用して行われているということですか?
  3. b) の場合、ヤング ジェネレーションとオールド ジェネレーションの両方がシングル スレッドでクリアされたということですか?

また、4. Full GC は OldGeneration または YoungGeneration のみに影響しますか?

前もって感謝します。

4

2 に答える 2

38

説明させてください。

例としてスループット コレクターを見てみましょう。(別名パラレルコレクター)。ドキュメントによると、複数のスレッドを使用してマイナー コレクションを実行し、メジャー コレクションには単一のスレッドを使用します (シリアル コレクターと同じ)。

ここで理解しておくべきことがあります。デフォルトでは、ほとんどの新しいシステムでは、JVM は Young 世代と Old 世代に 2 つの異なるガベージ コレクタを使用します。私のマシンでは、若い世代には並列の新しいコレクターがあり、古い世代には並行マークとスイープのコレクターがあります。

マイナー コレクションは、JVM が新しいオブジェクトにスペースを割り当てることができない場合にトリガーされます (覚えておいてください: 新しいオブジェクトは常に若い世代の Eden 領域に割り当てられます)。

次の問題:

フル GC とはどういう意味ですか? a) マイナー コレクションとメジャー コレクションの両方が実行されることを意味しますか? または b) フル GC == メジャー コレクション? どちらですか?

と、

また、4. Full GC は OldGeneration または YoungGeneration のみに影響しますか?

場合によります。JVM は、すべてのメジャー コレクションをフル GC として報告します。[これらのフラグで試してくださいjava -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp]。冗長な定義は、Full GC が最初に Minor を実行し、次に Major を実行することです (ただし、Older Generation がいっぱいの場合、最初に解放されて、Young Generation からオブジェクトを受け取ることができるようになると、順序が入れ替わることがあります)。

では、本題に戻ります。JVM は [古い (または Perm) 世代の] メジャー コレクションをフル GC と見なします。以下は、ポイントを説明するために簡単に書くことができたプログラムからの出力です。1 行目はマイナー GC、2 行目はメジャー (フル) GC です。古い世代 (CMS) でのみ発生し、古い世代を 1082K から 1034K に削減できたことがわかります。

  • 11.431: [GC 11.431: [ParNew: 1152K->128K(1152K), 0.0009893 secs] 2111K->1210K(6464K), 0.0010182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  • 17.882: [Full GC (System) 17.882: [CMS: 1082K->1034K(5312K), 0.0212614 secs] 2034K->1034K(6464K), [CMS Perm : 9426K->9410K(21248K)], 0.0213200 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

次の問題:

a) の場合、メジャーはシングルを使用して行われたのに対し、マイナー コレクションはまだ複数のスレッドを使用して行われているということですか?

はい。私の答えの冒頭を見てください。若い世代と古い世代は、異なるコレクターによって提供されます。若い世代の場合、次のいずれかを使用できます。

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:+UseParNewGC

古い世代の場合、利用可能な選択肢は次のとおりです。

  • -XX:+UseParallelOldGC
  • -XX:+UseConcMarkSweepGC
于 2013-05-14T22:23:47.443 に答える