2013-05-14 29 views
19

JavaのGarbage CollectionとSO Q & Aで読んでいますが、ガベージコレクションのタイプについては混乱しています。Javaのメジャーとマイナーガベージコレクション

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

今私の質問:

  1. それは完全なGCによって何を意味します。a)それは両方のマイナーおよびメジャーコレクションが行われているということですか?またはb)フルGC ==主要コレクション?どちらですか?
  2. a)の場合、メジャーはシングルを使用していましたが、マイナーコレクションは複数のスレッドを使用して行われていますか?
  3. b)の場合は、Young Thomson & Old Generationsの両方がシングルスレッドを使用してクリアされていることを意味しますか?

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

ありがとうございます。

+1

+1。おかげで質問がありました – Imposter

答えて

27

私を説明させてください。

スループットコレクタを例にして説明します。 (別名パラレルコレクター)。ドキュメントでは、マイナーコレクションを行うために複数のスレッドを使用し、メジャーコレクション(シリアルコレクタと同じ)に対しては1つのスレッドを使用しています。

これは何かを理解することです。デフォルトでは、ほとんどの新しいシステムでは、JVMは若者世代と旧世代の2つの異なるガベージコレクタを使用します。私のマシンでは、私はヤングジェネレーションのための並行ニューコレクターと、古い世代のための並行マークアンドスイープコレクターを持っています。

マイナーコレクションは、JVMが新しいオブジェクトにスペースを割り当てることができないときにトリガーされます(注意:新しいオブジェクトは常にYoung GenerationのEdenエリアに割り当てられます)。

次の質問:

それは完全なGCによって何を意味します。a)それは両方のマイナーおよびメジャーコレクションが行われているということですか?またはb)フルGC ==主要コレクション?どちらですか?

と、

また、4んフルGCは、同様OldGenerationまたはYoungGenerationに影響を与えますか?

によって異なります。 JVMはすべてのメジャーコレクションをフルGCとして報告します。 [これらのフラグを試してみてくださいjava -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp]小児期の定義では、フルGCがマイナーに続いてメジャー(最初の世代が満員の場合は順序を入れ替えることができますが、その場合は最初に解放されてヤングジェネレーションからオブジェクトを受け取ることができます)です。

OK、戻ってください。 JVMはメジャーコレクション(旧世代(またはパーマ)生成時)を完全GCとみなします。以下は、ポイントを説明するために私が素早く書くことができたプログラムからのアウトプットです。最初の行はMinor GCで、2番目の行はMajor(Full)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
+1

明確な質問とクリスタルクリアな答え – Imposter

+2

HotSpot 6(ただし、最初のリリースではありません)と若い世代と古い世代の両方を管理する7では、 '-XX:+ UseG1GC'もあります。 –

0

ゴブリンの答えは、広いストロークでまだ正しいですが、少なくともこの部分は現在、時代遅れです:

それは依存しています。 JVMはすべてのメジャーコレクションをフルGCとして報告します。

CMSとG1の両方は、新世代(マイナー)コレクション、旧世代と完全なGCSの同時コレクションを区別します。後者は最後の手段であり、GCの大半は新世代コレクションと並行コレクションによって処理されるべきです。

関連する問題