MinorGC理解とFullGC

1.GC回復メカニズムは世代アルゴリズムは何を知って、それに精通していますか?
2.ガベージコレクションのアルゴリズムJava仮想マシンを理解しますか?

    若い世代空間から(エデンとサバイバー領域を含む)を回復するメモリはマイナーGCと呼ばれています。主なGCは、恒久的な世代をクリーンアップします。若い世代と永久世代を含む-フルGCはヒープ全体のスペースをクリーンアップすることです。
> GCアンドロイド
アンドロイドのGCの原則は、探検-  http://geek.csdn.net/news/detail/193654

> どのようなJavaのGCはなぜGC ??があるはずされた
GCの目的:ヒープメモリを再利用するには、使用されなくなっ資源の解放オブジェクトなかっ
リサイクル時間:オブジェクトが永続的に参照が失われると、システムは、適切なタイミングでそのシェアを回復しますメモリ。

  GCにSystem.gc()またはRuntime.getRuntime()。GC()、
  自動を達成するようにするJavaによって提供GC機能が自動的にオブジェクトを監視することができ、忘れたり、メモリエラー回復手順が不安定あるいはシステムがクラッシュにつながることができ、範囲を超えメモリの回復の目的。効果的にメモリリークを防ぐことができますガベージコレクションは、メモリの効率的な利用を使用することができます。
 「世代別ガベージコレクション。」Javaのオブジェクトヒープメモリのライフサイクルに従います。このアプローチは異なる領域、ガベージコレクションプロセスに分割して、異なるエリアに移動する可能性があるオブジェクト: 
 -エデン(エデン):これは最初のターゲット領域の誕生である、としますほとんどのオブジェクトは、ここではその領域のみに存在しています。 
 -サバイバーパーク(サバイバー):エデンの園がダウンして生き残ったからオブジェクトをここに移動します。 
 -生涯ヤンガーデン(終身在職権):これは、オブジェクトに十分な存続古いの運命です。若い世代のコレクション(マイナー-GC)プロセスは、この場所に触れるつもりはありません。若い世代が人生を楽しんで公園にオブジェクトを収集することができない場合には、それはまた、大きなオブジェクトのための十分なスペースを解放するために、圧縮が伴うことが、完全なコレクション(メジャーGC)をトリガします。

  C / C ++で、役に立たないもののリリース変数のメモリ空間は、プログラマによって解決されます。
  JavaのGCでは、プログラマは手動でメモリ領域を解放する必要はありません。Java仮想マシンがメモリがタイトであることが判明した場合、それは自動的に無用の変数によって占められるメモリ空間をクリーンアップするために行きます。もちろん、必要であれば、プログラマが明示的にクリーンアップを行うために即時のメモリを強制するにSystem.gc(Javaプログラム)を使用することができます。ヒープメモリの明示的な宣言は、フルスキャンを行うことですので、それは完全なGCで、すべての活動を停止する必要がある(世界収集の停止)、アプリケーションがこれを買う余裕ができますか?表示コールにSystem.gc()は、仮想マシンにのみ推奨あるにSystem.gc()は非常に低い優先度のスレッドで実行するため、必ずしも実行されません。
  GC機能が自動的にオブジェクトが自動的にメモリを再利用の目的を達成するための範囲を超えてのJava、Java言語は、割り当てられたメモリの操作表示ロシアを解放するための方法を提供していません。アプリケーションでは、限りオブジェクトが到達不能になったとして、それは、ルート(根)ガベージコレクタの対象となるであろうオブジェクトを参照しません。

GCの基本原理:
 プログラマのための1、我々は呼んでヒープメモリ、上に割り当てられている新しいキーワードで「アップ。」GCにとっては、限り、すべての参照オブジェクトとして、私たちは「到達不能」と呼んでいる、nullでメモリを回復することになります。
 オブジェクトが作成されると2、GCは、サイズ、メモリのアドレスと、このオブジェクトの使用の監視を開始します。GCは道をマッピングするために、ヒープ(ヒープ)内のオブジェクトと記録管理のすべてを採用しており、この方法は、オブジェクトがあり、何でないものを片付けることができます。それが到達不能であると判断された場合、それが再利用されます。
 3. GCは、Javaはその多くの厳格なルールの行動を規制、異なるプラットフォームでの実装上の問題を確認してください。アルゴリズムの使用は何かについては、ときにリサイクル。

- GCコレクタは何?

1.serialコレクター
単一のスレッドは、スレッドが仕事で他の作業を中断する必要があります。クライアントマシンに使用、コピーアルゴリズムを使用し
2.ParNewコレクタ
シリアルコレクター、コレクターの新世代のための選択の仮想マシンサーバモードのマルチスレッド版を。レプリケーションアルゴリズム
3.Parallelスカベンジコレクタ
複製アルゴリズムは、スループットは、コレクタを制御することができます。すなわち、一定時間効果的な運用。
4.Serialオールド・コレクター
のシリアル-古いバージョンでは、照合アルゴリズムを使用します。
5.Parallel旧コレクター
古いバージョンの第三のコレクタ、マルチスレッド、タグを整理する
6.CMSコレクタ
目標を最短リカバリ時間を停止することです。7.G1コレクタは、基本的な考え方は、最大のリサイクルの値を収集するために、複数の地域、優先順位の領域にスタックを分割することです。

> JavaのGC、GCアルゴリズムのためのGCメカニズム
メモリ割り当てプロセス(由来「エキスパートJavaGCは一部になり、私は」のために-http://www.importnew.com/1993.html
JavaGCの専門家パートIIになる- Javaのガベージコレクションを監視する方法- http://www.importnew.com/2057.html
のJDK5.0ガベージコレクションの最適化- http://calvin.iteye.com/blog/91905
3つの比較的Java仮想マシンのガベージコレクション機構(ホットスポット、JRockitの、IBM JVM) - https://blog.csdn.net/ZYC88888/article/details/70918799
ガベージコレクタ、オブジェクトが生存しているかどうかを決定する方法- http://blog.csdn.net/TyroneRenekton/article/details/59114835?ref= myread
-メモリ割り当て、GCの原則とガベージコレクタ- http://blog.csdn.net/zjf280441589/article/details/53946312 JVM探査
のJavaのメモリ領域:します。https://yq.aliyun JVMの1の-depth理解を。 COM /記事/ 14408#

メモリ割り当て(場合Javaオブジェクトを作成して)、メモリリコール: - Javaでは、これは、2つのメモリ管理を含みます。プログラムの限られたメモリをより効率的かつ完全な利用を書くために、JVMを理解します。
  ; 2)デフラグ1)メモリの回復:Javaのガベージコレクションは、主に2つのことを行います。

  メモリ管理のヒント:
  直接、例えば1)可能な限り量:文字列javaStr =「見習いの成長過程」;
  2)とStringBufferのStringBuilderの文字列連結およびその他の操作;
  3)とすぐに不要なオブジェクトの解放など;
  4)の使用を最小限に抑えます静的変数;
  5)キャッシュ一般的に使用されるオブジェクト:あなたは、オープンソース、オープンソースのキャッシュを使用することができ、EG:OSCacheの、Ehcacheの;
  6)のfinalize()メソッドを使用しないようにしてください。
  7)必要な場合には、ソフト参照SoftReferenceを使用することを検討してください。

- GC回復メカニズムアルゴリズム:世代コピーガベージコレクションとマーキングガベージコレクション、インクリメンタルガーベジコレクション。

   、様々なメモリ・オーバーフローや漏れのトラブルシューティング、パフォーマンスのボトルネックを解決し、高い並行性を達成するため、より効率的なプログラムを書くために私たちの毎日の仕事で私たちを助けることができるJavaのGCメカニズムを学びます。私たちは、JavaのGCメカニズム4つの側面を学びます。

図1に示すように、メモリが割り当てられる方法。

2、そのメモリを確保するために、どのようにエラー回復ではありません(例:回復する必要があるメモリ)。

3、どのような状況の下で実行するようにGCとGCの実装。

図4に示すように、監視およびGC機構を最適化する方法。

-メモリJVMの領域で明確な境界でなければならないのJava GCメカニズムをご覧ください。
:Javaランタイムのデータ領域では、JVMは、メモリ領域を複数のモジュールに分割された管理
  プログラムカウンタは、現在のスレッドを実行するバイトを示すための比較的小さなメモリ領域である:プログラムカウンタ(プログラムカウンタレジスタ)最初の数行のコードの実行は、現在のスレッドの行番号インジケータとして理解することができます。職場でのバイトコードインタプリタは、カウンタ文命令の値を変更することにより、削除されます。
 それはスレッドに対してプライベートであるように、各プログラムカウンタは、(スレッドプログラムカウンタがある)、行番号にのみスレッドを記録するために使用されています。
   プログラムは、Javaメソッドで実行された場合、カウンタは、実行中の仮想マシンのバイトコード命令のアドレスを記録し、実行された場合であるローカル(Cで書かれたネイティブが完了する)方法、カウンタ値は、未定義ですそこにあるように、プログラム・カウンタは、ちょうど現在の命令のアドレス、メモリオーバーフローを記録するので、そのため、プログラムカウンタは、すべてのJVMのメモリ領域は、OutOfMemoryErrorの定義領域だけではないです。

  図2に示すように、仮想スタックマシン(JVMスタック):各メソッド、実行のスレッドは、スタックフレームが作成されている間(Statckフレーム)、ローカル変数テーブルに記憶されているスタックフレーム、操作ステーション、動的リンク、方法輸出、メソッドが実行される方法が完了したスタックで、JVMスタックフレームスタック、呼び出されたときに、スタックフレームスタック。
   すべての基本データ型、オブジェクト、リターンアドレスへの参照を含む方法を、関連するローカル変数に格納されたローカル変数テーブル。ローカル変数テーブルでは、長いだけとダブルは2つのローカル変数のスペースを取る(スロット、32ビットマシンのために、スロットは、「32ビットである)、他はスロットです。なお、ローカル変数テーブルはコンパイル時に決定されるが、完全に決定されるスタックフレームに割り当てられた操作方法に必要なスペース良いされている、それがライフサイクルアプローチ中に変化しません。
   VMスタックは、呼び出し元のスレッドのスタックの深さはStatckOverFlowError(スタックオーバーフロー)スローされた仮想マシンで許可された最大の深さよりも大きい場合、例外の2種類を定義しますが、動的に拡張する仮想マシン・スタックのほとんどのJava仮想マシン許容サイズ(ほとんどありません部分)が固定長であるので、あなたは常にメモリ不足を知って、スレッドスタックを申請することができ、この時間は、)メモリ不足(OutOfMemoryErrorがスローされます。
   各スレッド・スタックは、仮想マシンのスレッドスタックがプライベートで、仮想マシンに対応しています。

  3、ネイティブメソッドスタック(ネイティブメソッドStatck):ネイティブメソッドスタック等の仮想マシンスタック効果、操作機構、異常型、同じである唯一の違いは、仮想マシン・スタックは、Javaメソッドの実装で、ネイティブメソッドがスタックしつつあります実行するためのネイティブメソッドは、多くの仮想マシン(例えば、SunのJDKのデフォルトのHotSpot VM)で、ネイティブメソッドスタックが一緒に使用される仮想マシンでスタックします。
  ネイティブメソッドスタックは、プライベートスレッド。

  4、ヒープ(ヒープ):JavaのGCヒープ領域の最も重要なエリアではなく、1のメカニズムを理解することです。JVMのメモリヒープ領域で最大の作品であるマネージド、スタック領域は、仮想マシンの起動作成したメインメモリ領域で管理されるJavaのGCメカニズム、すべてのスレッドで共有ヒープ領域、です。ヒープ領域オブジェクトのインスタンスを格納することで、原則的に、すべてのオブジェクトは(現代の技術では、それは絶対的ではなく、また、直接スタックに割り当てられますが)ヒープメモリ領域に割り当てられています。
  一般に、Java仮想マシンの仕様によれば、(物理的に必要としない)論理的に実装されるとき、固定サイズであってもよいし、拡張することができる連続ヒープメモリであることが必要で、仮想マシンのヒープの現在主流面積が拡張可能です。、ガベージコレクションの実行後に、まだ十分なメモリ割り当てを持っていない場合は、もはや広げることができない、それはOutOfMemoryErrorがスローされます:Javaのヒープ領域の例外を。
    「Javaのメモリ割り当てメカニズム。」

  5.メソッド領域(方法エリア):Java仮想マシン仕様では、ヒープの論理的な部分として、メソッド領域は、処理すべき、しかし実際には、メソッド領域は、(非ヒープ)スタックしません。また、多くの人のブログを、JavaのGCは、世代収集機構は3つの世代に分けられている:若い世代に、昔、恒久的な世代、これらの著者は、理由は、以前のHotSpot Java仮想マシンの実現のために、「恒久的な世代」としてメソッド領域を定義します途中、ゾーン法、および恒久的な世代になるために設計されたメソッド領域を拡大するためのアイデアの世代のコレクション。しかし、に加えて、いない地区法の恒久的な代理としてのHotSpot仮想マシンのほとんどのホットスポット自体が、また、恒久的な世代を廃止する予定です。ここでは、私は主にOracleのJDK6.0を使用するため、用語恒久的な世代を使用していきますので、。
  メソッド領域は、仮想マシンがクラス情報(バージョン、フィールド、メソッド、インターフェース、などを含む情報を、ロードする、即ち、クラスのロード)、最終的な定数、静的変数、コンパイラがロードされた格納するために、それぞれのスレッド領域によって共有されていますインスタントはそうでコードをコンパイルして。
  連続的な、固定サイズの物理的な領域を必要としない方法を選択またはサイズに拡大し、スタックよりも限られた方法の他の部位であってもよい:ガベージコレクションを実行するかどうかを選択することができます。一般に、ガベージコレクション領域の実装の方法が原因永久世代(ホットスポット)の一つとして知られているが、これは方法のガベージコレクションには領域が存在しないというわけではありません、どの方式エリアであり、非常に小さいですガベージコレクションは、主にロードされたクラスのガベージコレクションとアンロードの定数プールに向けられます。
  非常に困難なごみの収集方法、および過酷な条件の分野では、効果は使用はさらなる研究を残すことができた後、一般的に考慮しても過言ではありませんが、満足のいくものではありません。
  メソッド領域に定義のOutOfMemoryErrorで:PermGenスペース例外がメモリ不足を投げ。
  実行時定数プール(実行時定数プール)領域がリテラル定数を格納するための方法の一部では、基準シンボルに符号化される文字列は変数で表される(時間は、直接翻訳参照符号は、参照インターフェイスをコンパイル生成しました位置は、アドレスを直接参照)はクラスリンク段階で変換を完了するために、シンボリックリファレンスに従って変換され、コンパイル時定数を格納する定数プール加算を実行時、(例えばStringクラスのインターンとして()が発生実行時定数を格納することができますこの方法は、一定の文字列プールを維持することで、「ABC」と呼ばれる文字は、定数プールにされている場合は、文字列のアドレスプールが返される。そうでない場合は、新しい定数をプールし、リターンアドレス)に参加。

  6、ダイレクトメモリ(ダイレクト・メモリ):JVMのメモリは、メモリを管理し、直接ではなく、直接メモリを理解することができ、マシンはJVMのメモリの外に、例えば、あなたが4Gのメモリを持っている、JVMは1Gを占領し、3Gは、残りのですJDKに基づいたダイレクトメモリは、チャネル(チャネル)とバッファ(バッファ)メモリ割り当てが格納されているDirectByteBuffer JVMスタックを参照して、ネイティブのC言語ライブラリダイレクトメモリ割り当てにより、存在します。ダイレクト・メモリは、マシンのメモリを制限受信すると、それはまた、非常にあるOutOfMemoryErrorが発生する可能性があります。

-アクセス方法Javaオブジェクト。JVMスタック、ヒープ、メソッド領域:一般的には、Javaの参照アクセス・メモリは、三つの領域を含みます。
オブジェクトOBJ =新しいオブジェクト()例:最も単純なローカル変数参照して
  、対象物OBJは、JVMスタック内のローカル変数に格納されたローカル参照テーブルを表す参照データ型を表す
  オブジェクトデータの一例が格納されているように)(新しい新しいオブジェクトスタックに、
  スタック型の情報も記録されている(インタフェース、メソッド、フィールド、オブジェクトタイプ、等)オブジェクトクラスアドレス、データは、メソッド領域で実行され、これらのアドレスに格納され、
Java仮想マシンの仕様を、参照によって規定をしなかったオブジェクトにアクセスするために特定の参照を入力します。

- JavaのGCのメカニズム:

JVMのガベージコレクションは、内蔵の普遍原則。:ヒープメモリはエデン、サバイバー(若い世代)、終身/旧(才)のスペースに分かれて
1.Minor GC
    メモリの回復はマイナーGCと呼ばれ(エデンとサバイバー領域を含む)若い世代空間から。しかし、時にマイナーGCイベント、注意すべきいくつかの興味深い場所があります:
    JVMが新しいオブジェクトのためのスペースを割り当てることができない場合には、そのようなエデン領域がいっぱいになったときのように、マイナーGCをトリガします。だから、分配率が高いが、より頻繁にマイナーGCを行いました。メモリプールがいっぱいになると、内容がすべてコピーされます、ポインタが0から空きメモリを追跡を開始します。エデンとサバイバーの領域は、圧縮、スキャン、古典的なタグを置き換え、クリーンアップ操作をマークし、コピー操作されました。だから、そこにエデンとサバイバーの領域にはメモリの断片化ではありません。ポインタは常に使用されるメモリプールの上に滞在書きます。マイナーGC操作が実行され、それは永久的な世代には影響しません。GCのルーツは、参照が永遠の世代に、若い世代から直接、マークフェーズでは無視される若い世代の永久世代への参照からです。
   挑戦従来の知識、マイナーGCのすべては、「世界中の一時停止トリガします(世界-STOP時)」、停止スレッド・アプリケーションを。ほとんどのアプリケーションでは、遅延は無視できるほどできポーズによって引き起こされます。これでは真実はそれが地域や遺族古い空間にコピーされることはありません、オブジェクトのエデン面積のほとんどがゴミと見なされています。反対に、エデン地区trueの場合、オブジェクトのほとんどはマイナーGC社長多くの実行時間を一時停止し、新生児GC条件を満たしていません。
  状況そうマイナーGCは非常に明確である-毎回マイナーGCは、メモリの若い世代をクリーンアップします。

フルGC GC VS 2.Major
    主なGCは、恒久的な世代をクリーンアップすることです。若い世代と永久世代を含む-フルGCはヒープ全体のスペースをクリーンアップすることです。
残念ながら、それは実際にはもう少し複雑で混乱しています。まず、多くの主要なGCは、マイナーGCによってトリガーされるので、多くの場合、これらの2つのGC分離はほとんどありません。一方、多くの近代的なガベージコレクションは、スペースの恒久的な世代の一部をクリーンアップするので、用語の「クリーニング」は部分的にしか正しい使用します。
   これは、私たちは、最終的に主要なGCまたはFull GCと呼ばれている気にする必要はありませんし、我々は現在のGCは、すべてのアプリケーションスレッドを停止、または同時治療はスレッドアプリケーションなしに停止することができるかどうかを心配する必要がありますことができます。

   この混乱にもJVMの標準ツールに組み込まれています。ここで私が何を意味するかを説明する良い例です。のは、コレクタ並行マーク2種類のツールを比較してスイープしてみましょう(-XX:+ UseConcMarkSweepGCを)実績出力JVMで実行されています。
   JVMについて、現在最も使用されるSunのJDK、JDK6まで1999 JDK1.2の初め以来、年はまだ広くデフォルトの仮想マシンのホットスポットである、使用されていることに留意すべきです。JRockitのホットスポットは、Oracleはまた、今は新しいリリースでは、2台の仮想マシンを統合する意思を見せたい:2009年に、Oracleは、Oracleは二つの大きな3つの仮想マシンを持って、EBAの買収前に会社と相まって、日を取得しましたメカニズムは、主にホットスポットのGC機構を指し、JDK7は、デフォルトは、依然としてHotSpot仮想マシンであるので、このデフォルトのHotSpot仮想マシンが記載されています。

- 基本的なアルゴリズムのGCメカニズムは次のとおりです。世代コレクション

 新世代は:一般的に速く、あまりにも速く消失が発生し多数のオブジェクトを指し、旧世代:一般的に、オブジェクト生成の多数を指し排除することは容易ではありません。
-若い世代:
 新世代の主なガベージコレクション方式、新世代は、「使用停止-コピー」クリーンアップするためのアルゴリズムは、新世代のメモリは、比較的小さな二つの部分、エデン1区の大部分、パート1サバイバーに分かれていますそれは二つの等しい部分に分割されます。クリーンアップするたびに、エデンの面積とサバイバーはまだ生きているオブジェクトは、他のサバイバーにコピーされ、そしてエデンとサバイバーのうち、次にちょうどきれい
    (従来のストップコピーアルゴリズムメモリ2等分使用、複製アルゴリズムを停止し、ここにも見つけることが、大きな面積の新世代と二つの小さなエデンサバイバーの使用は、2つの部分を、複製することができ、常に同じではありませんこの問題を回避するためのエリア)
  ほとんどのオブジェクトでもサバイバー未満で生き残り、短命なので、エデンの面積の割合とサバイバー大きな、ホットスポットのデフォルトは8であるから:それぞれ新世代の80%を占め1、 、10%、10%。回復、サバイバー+エデンは、メモリの10%以上を生き残る場合は、古い時代にオブジェクトの一部を割り当てる必要があります。-XXで:Survivor1:Survivor2 = 8:エデン領域サバイバー領域の容量比を設定するためSurvivorRatioパラメータは、デフォルトではエデンの8、代表的である 1:1。

-旧年:
   古いオブジェクトのメモリ若い世代よりもはるかに多く、そしてときにそれらの多くの大規模なオブジェクト、あなたがストップを使用する場合は、クリーンアップの古い記憶すべき-複製アルゴリズムは、むしろ非効率的です。一般的に、古い代替アルゴリズムがされているラベル-ソートアルゴリズム、すなわち:マークまだ生きているオブジェクト(そこが挙げられる)、全ての生存オブジェクトは、連続的なメモリを確保するために、一方の端部に向かって移動します。
     + HandlePromotionFailure(許可:はい、直接-XXのかどうかを確認するために、それ以外の場合は、完全なGCをトリガーする場合はマイナーGC、プロモーションのために残りのスペースをチェックする仮想チャンスの際には、古い時代を入力するかどうかを各時間は、古い時代のサイズよりも大きいです保証の故障)、許可された場合、唯一のMinorGCとなり、その後、メモリ割り当ての障害に耐えることができ、そうでない場合-XXのフルGCがいる場合、あなたはまだこれが表す(実行することができます:+ PromotionFailureハンドル、トリガが同時にMinorGCをトリガされますフルGC、それは古いですし、そこに多くのメモリがあるので、それはそうしないのが最善です場合でも)。
    メソッド領域(永久世代)、二つの永久置換回復がある:定数プール、無駄なクラス情報、回復は単純な定数であるが、何の言及を回収することはできません。リサイクルのために役に立たないクラスの場合は、3つの点が確保されなければならない:クラス1は、すべてのインスタンスが回復してきた; 2クラスローディングのClassLoaderが回収されています。3.クラスオブジェクトは、オブジェクトのクラス(すなわち、によって反射されたそのような参照)で参照されていない
   永久的な生成の回復が必要ではないが、パラメータで設定することができるが、回復に基づいています。+ TraceClassLoading、-XX:ホットスポットは、-verbose使用-XX、-Xnoclassgc制御を提供する :+ TraceClassUnLoadingは、 クラスのロードを表示し、情報アンロードすることができる:
     -verbose、-XX:+ TraceClassLoadingホットスポットの製品バージョンを使用することができます。
     -XX:+ TraceClassUnLoadingは、ホットスポットのサポートのfastdebugバージョンが必要です。

- ガベージコレクタ

   ガベージコレクタを導入することは明らかである必要があります前に、メモリの回復は、あなたが他のすべてのスレッドの実行を中断する必要があること、つまり、ある意味で新しい世代で使用、複製アルゴリズム、「停止(STOP-世界)」を停止します。これは非常に非効率的で、そして今、これを最適化するために、コレクターの新世代の様々なより多くの、まだちょうど時間が短い停止し、完全に停止を解除ません。

  1.シリアルコレクター:コレクターの新世代、コピーアルゴリズムを使用して停止するには、スレッドGCを使用して、別のワーカーが中断しました。使用-XX:+ UseSerialGCは、メモリ回復のためのシリアル+シリアルオールド・モード(クライアントモードで実行している仮想マシンのデフォルトの値である)を使用することができます
  。2. ParNewコレクター:、コレクターの新世代をコピーアルゴリズムを使用して停止し、シリアルコレクタ時間のガベージコレクションを短縮するために、注意を作業を中断する複数のスレッド、他のスレッドでGCとバージョンをマルチスレッド。メモリ・リカバリを実行するスレッドの数にParallelGCThreads:;:使用-XX -XXを用い+ UseParNewGCメモリを採取使用ParNew +シリアルオールドコレクタ組成を制御するスイッチ。
  3.並列スカベンジコレクタ:新世代のコレクタ、停止複製アルゴリズム、注目CPUスループット、すなわち実行時間/合計時間、例えば、ユーザコード、使用:JVM 100分を実行して、ガベージコレクション、ユーザコードを実行するには99分〜1分、スループットが99%で、コレクタはバックグラウンド動作の実行に、CPUを最も効率的に使用すること(ユーザとの対話のためので、少し時間を待って、そのようなCMSとしてコレクターのガベージコレクション時間短縮の注意をし、ユーザーエクスペリエンスを向上させる)ことができます。使用-XX:+ UseParallelGC(Serverのデフォルトモードである)パラレルの清掃+シリアル旧ガベージコレクタアセンブリを使用して制御を切り替える。-XX使用:合計時間の割合を設定するためにユーザが行うGCTimeRatio、デフォルト99を、またはガベージコレクションのために使用される時間の1%。-XXを使用してください:MaxGCPauseMillisはGCの最大休止時間を設定します(このパラメータは、パラレル清掃をするためにのみ有効です)
  4.シリアル旧コレクター:コレクタ歳、シングルスレッドのコレクター、使用タグ(整理整理とクリーンアップの方法は、コンパクトを掃引するには、圧縮され、現存する唯一のオブジェクトを残して、殺すために廃棄されたオブジェクトをクリーンアップすることで、圧縮は、オブジェクトを移動することです、スペースは他の作業スレッドが中断されるGCであった単一のスレッドを使用して、2へのメモリ、オブジェクト全体、アイドル)アルゴリズムの一部を確実に埋める(ノートでは、他のスレッドを中断する必要が古い時代にクリーンアップするが、照合アルゴリズムをマーク)、JDK1.5前に、シリアル旧コレクターや使用にParallelScavenge。
  5.パラレル旧コレクター:コレクタ歳、マルチスレッド、マルチスレッド存続することを意味し、集約された圧縮された要約の概要コンパクトで、あるメカニズムとパラレル清掃をここで整理することが悪い良い使用タグ(シリアル旧異なる、照合とコピーは、パラレルオールド・実行は、他のスレッドがまだ一時停止する必要があるアルゴリズム、)放棄されたオブジェクトをクリーンアップとしてではなくスイープ(クリーンアップ)よりも、事前に準備された領域にオブジェクト。平行旧は、マルチコア・コンピューティングに有用です。後に(JDK 1.6)パラレルオールドが発生し、良好な結果と並列の清掃、及び全並列スカベンジコレクタスループット優先効果を反映しています。収集のための並列スカベンジ+パラレル旧組成コレクタを使用してスイッチング制御を+ UseParallelOldGC:-XX使用してください。
  6. CMS(並行マークスイープ)コレクタ:コレクタ歳、、、同時コレクターの利点は、(ユーザーのスレッドが同時に動作するとGCスレッドすることができます)小さな一時停止、一時停止、明確なラベル付けアルゴリズム、マルチスレッドを使用するための最短の回復時間を得ることにコミットしています。使用-XX:+ UseConcMarkSweepGCをParNew + CMS +シリアル古いが好ましくParNew + CMS(後で理由を参照)に使用されるメモリの再利用を行うことが、代替シリアル旧コレクションを使用する際にメモリのうちユーザスレッド。
  CMSの収集方法は次のとおりです。最初のマーク3もう一度クリア倍、3倍の最初の2つのマークでは、最初のマークと再マークである(この時点ではまだ()は、世界を停止停止する必要があります)、最初のマーク(初期備考)がマークされていますオブジェクトGC根に連結することができる(つまり、オブジェクト参照である)、短時間の一時停止、同時マーク(同時発言)GCルーツコースの参照を見つける実行することである、ユーザ・スレッドの休止を必要としない;(備考)再ラベル付け初期マークでありますそして、並行マーク中に、その部分の著しい変化があったまだマークされる必要があるので、マーキングプロセスのこの部分を追加し、滞留時間が、わずかに長い並行マークよりも、元のマークよりもはるかに小さいです。完了マークした後、同時をクリアするために始めた、ユーザーがスレッドを停止する必要はありません。
  したがって、それは非常にインタラクティブなアプリケーションに適しており、CMS洗浄工程、マーキングだけと再マーキング短い休止を必要とする最初の、そして並行マークと同時ユーザーをクリアするには、スレッドを一時停止する必要がないので、効率が非常に高いです。
  CMSはまた、システムの負担(開始するスレッドのCMSのデフォルト数(CPU 3の数)/ 4)に増加し、追加のCPUとメモリリソース、CPUとメモリのリソースでの緊張、少ないCPU時間を消費するという欠点があります。
  また、同時収集プロセス、ユーザスレッドがまだ実行されている、まだメモリごみを発生し、それが、これはGCの間に、十分確保しておく必要があるので、次のフルGCの前にクリーンアップするだけで、きれいにすることができない「浮きゴミ」を有することができますユーザー・スレッドのためのメモリ。、ときのフルGCが行われます:だからCMSコレクタは歳トリガーのフルGCの完全なだけではありません使用していますが、(CMSInitiatingOccupancyFractionセットを-XXを使用する、すなわち68%のデフォルト、2/3)の半分以上を使用してユーザスレッドは、メモリが特に大きくない消費する場合、-XXを増加させるために適切であり得る:予約済みメモリが十分なユーザスレッドでない場合CMSInitiatingOccupancyFractionは、パフォーマンスを向上させる、GCの数を減らすために、コンカレントモード故障がトリガされ、この時間は、代替的なトリガする:使用をシリアル・オールド・コレクターが収集しますが、長い休止のこの時間は、そう-XX:CMSInitiatingOccupancyFraction設定が高すぎるべきではありません。
  -XXと、全GC後にデフラグするかどうかを設定するために+ UseCMSCompactAtFullCollection:そこに、CMSは、メモリの断片化につながることができ、マークスイープアルゴリズムを使用して、あなたは-XXを使用することができますCMSFullGCsBeforeCompactionは、非圧縮の実行回数を設定します全GC後、帯域圧縮のフルGCへ。
G1のコレクター:正式JDK1.7にリリースされ、新世代のステータスが、コンセプトは現在あまり使用され、古い年とは非常に異なっている、それは説明しません。
並行(コンカレント)と平行(平行)の違いに注意してください。
     同時実行がユーザスレッドとGCスレッドの実行を指す(必ずしも平行ではなく、可能な交流が、通常、同時に実行される)、ユーザが実際に(スレッドを停止する必要がありません、 CMSのユーザーがまだスレッドを一時停止する必要がありますが、非常に短い、GCスレッドは)別のCPU上で実行されます。
     並列コレクションは、並行して複数のGCスレッドを指すが、この時間は、ユーザスレッドが中断されるため、シリアルおよびパラレルコレクタは平行であり、CMSコレクタは同時です。

-ガベージコレクタの古典的なアルゴリズム:
  1)参照カウント(参照カウント)
基本的な考え方は次のとおりです。オブジェクトが作成され、オブジェクトに割り当てられている場合、参照カウンタが1に設定されるたびに、変数の割り当てに任意のオブジェクト、参照カウント+ 1;あなたは終了-1の参照カウントの範囲。参照カウントが0になると、オブジェクトがガベージコレクトすることができます。
参照カウントは、それぞれの利点があります。各操作のためのプログラムの実施は時間の非常に小さな期間を要します。それはあまりにも長い間中断することはできませんリアルタイムシステムのための自然な利点があります。
しかし、その欠点を有する:リングは(二つのオブジェクトのそれぞれを参照)を検出することができない、参照カウントは、より時間がかかる場合、それぞれ増加または減少しました。近代的なガベージコレクションアルゴリズムでは、参照カウントは使用されなくなりました。
  2)マーク・スイープ(ラベルクリーンアップ)
基本的な考え方は次のとおりです。(生体として知られている)すべての参照を見つけるために、ルートからの各セットは、それぞれ1トラックが完了したときには、すべての非標識をそのマークを作った、発見されましたオブジェクトは、ごみをリサイクルする必要があることです。
また、追跡アルゴリズムとして知られているラベルに基づいて、クリア。ガベージコレクションステップは、二つの段階に分けられる:マークフェーズ中に、ガベージコレクタとツリートラバーサルZhengke基準マークは、各オブジェクトに遭遇しました。ステージをクリアする、非標識のオブジェクトが解放され、メモリに利用できるようになります。
  3)コピーコレクション(コピーコレクタ)
基本的な考え方は以下のとおりです。メモリは、一つが現在使用中である、2つに分かれており、他の一つは、現在使用されていません。利用可能なメモリ、標識されたメモリ領域、及び倒立二領域である現在のメモリ領域の全てのマークされたオブジェクトの未使用のコピーが存在しない場合に、各使用の割り当ては、メモリ内に、すなわち領域が現在使用可能になるれます現在使用されていない、と現在のアルゴリズムを継続し、未使用の現在利用可能になります。
その後、プログラムのすべての活動を停止する必要があり、コピーアルゴリズムが長く、忙しい作業コピーを開始しました。この点は、その不利な場所です。
  近年では、2つのアルゴリズムがあります。
  4)世代別ガベージコレクション(世代)
アイデアはに基づいています:
  (1)オブジェクトのほとんどは、ほとんどのプログラムは非常に短い寿命を持って作成されます。
  (2)が作成されたオブジェクトプログラムの大部分の非常に長い寿命となっています。
主な欠点は、彼らは単に長期生存のオブジェクトの一部をコピーするために多くの時間を要するアルゴリズムをコピーすることです。
アルゴリズムの基本的な考え方は、世代です:メモリ領域の2つ(またはそれ以上)、若い世代の中の代表的な、古い世代の他の代表。異なる特性のために、古い世代のために若い世代より頻繁にガベージコレクションのコレクションは、常に収集されていないオブジェクトを生活される若い世代のガベージコレクションを毎時間以下で、これらのオブジェクトを収集し、住んで増加しました。成熟度が一定レベルに達すると成熟は、それはメモリブロックの古い世代に配置されます。
メモリの断片化を回避しながら、ダイナミック良いガベージコレクションを達成するための世代アルゴリズムは、多くが使用するJVMのガベージコレクションアルゴリズムです。
  5)保守的なガベージコレクション(保守党)

おすすめ

転載: www.cnblogs.com/leeego-123/p/11298267.html
おすすめ