JVMのガベージコレクションこれらのもの

2018年5月14日に書かれました

伝統的なコンパイル言語の大きな違いの1よりもこのクロスプラットフォームのJava VMクラスC ++言語は、自動ガベージコレクションのメカニズムの導入です。自動ガベージコレクションが大幅Javaプログラマの開発効率を向上させ、大幅に誤りの確率を減少させ、常にではないが、C ++に匹敵するパフォーマンスの面で、C ++プログラマのようなメモリを操作することができないという点で結局同じ。もちろん、JVMは長年ので、かなりの開発、JIT、AOT技術の導入をした、と実行時の最適化のいくつかに依存しているとしても、JavaとCの間の性能ギャップが++非常に小さいです。JVMは、これらの年は、メモリ回復技術の開発であったが、常に進化しているが、プログラマはOOMを取り除くことができない、常に悪夢です。JVMの技術では、開発者の場合には透過100%に開発されていない、JVMのガベージコレクションメカニズムと操作の基本原則を把握する必要があります。

プログラムカウンタ
アクション:現在のスレッドを実行するためにバイトコードの行番号を記録します。バイトコード命令インタプリタの作業バイトコードは、このカウンタの値を変更することにより、いずれかを選択するときに実行されます。
意味: JVMは、私たちのために、交互に達成するためにスレッドを介してスイッチング及び分布並列プロセッサは、命令の唯一のスレッドが実行されるという事実マルチスレッドプロセッサです。したがって、命令の各スレッドの安全かつ円滑な執行を確保するために、各スレッドは、独自のプライベートプログラム・カウンタがあります。
記憶内容:スレッドがJavaメソッドを実行して、実行中のスレッドの命令をバイトコード仮想マシンのプログラムカウンタアドレスに記録されています。プログラムカウンタが空の場合、スレッドは、ネイティブメソッドを実行している場合。
例外が発生する可能性があります。このメモリ領域は、JVMのメモリオーバーフロー例外(OutOfMemoryErrorが発生)に発生しません唯一の領域です。

VMのスタック
効果:実行の説明Javaのメモリモデル方法。方法の輸出は、ローカル変数テーブル情報、オペランドスタック、ダイナミックリンク:各方法は、メモリのデータ領域を開く操作、となるスタックフレーム、スタックを含むフレームを格納するために必要と同時に行われます。
意味: JVMスタックベースであるので、最後まで実行から各メソッド呼び出しは、スタックフレームに対応し、仮想マシンプロセススタックにスタック全体を押します。
保存されたコンテンツ:ローカル変数テーブル輸出のため、オペランドスタック、動的にリンクされた、及び他の情報(既知のすべての基本データ型、基準点とバイトコード命令RETURNADDRESS型のタイプのコンパイルされました)。
それは注目に値します:必要なローカル変数テーブルのメモリ空間は、コンパイル時に割り当てを完了すること。ステージの動作方法でローカル変数テーブルのサイズを変更しないであろう。
可能性のある例外:スタックは、スレッドの深さは、仮想マシンの許容深さを要求されたよりも大きい場合、にStackOverflowError例外をスローします。あなたは、動的にメモリを拡張し、十分なメモリを適用することができない場合は、OutOfMemoryErrorがスローされます。

ネイティブメソッドスタック
役割: Nativaネイティブメソッドに呼び出されたJVMのためのサービス。
可能な例外は:仮想マシンのスタックは非常によく似た異常を表示されます

Javaのヒープ
役割:すべてのスレッドは、仮想マシンをオンにしたときに作成メモリ領域を共有しています。
意味
よりよいメモリを割り当てるために、1つのストレージ・オブジェクト・インスタンス。
2、ガベージコレクション(GC)。ヒープは、ガベージコレクタによって管理されるメインエリアです。メモリのより良い回復。
コンテンツストレージ:ストレージ・オブジェクトのインスタンスは、ほとんどすべてのオブジェクトインスタンスは、ここで割り当てられています。スタックは限りロジックが連続していてもよいように、物理メモリ空間内で連続していなくてもよいです。
それは注目に値する:ヒープが少ない絶対になってきた上で、このようなJITコンパイラなどの技術の開発では、すべてのオブジェクトが割り当てられています。いくつかのオブジェクトインスタンスは、スタック上に割り当てることができます。
可能例外:実現スタックは、コンフィギュレーションファイルを設定することによって拡張するために提供され得る固定されたサイズであってもよいです。何のメモリをヒープに割り当てられていない、と拡張することができない場合は、OutOfMemoryErrorがスローされます。

メソッドエリアの
効果:ランタイム定数プール、クラス情報を格納するためには、仮想マシン、定数、静的変数は、そのようなコードコンパイラなどのリアルタイムデータにロードされています。
意味:規定を作るために随時ボリュームプール、定数、変数や他の静的データを実行しています。
コンテンツストレージ:ランタイム定数プール(動的な性質)、クラス情報は、コードやその他のデータをコンパイルするために、仮想マシン、定数、静的変数、時間コンパイラにロードされています。
例外が発生する可能性がありますメモリ割り当て領域の方法は、需要を満たすことができないときは、OutOfMemoryErrorがスローされます。

これらは、特定のJVMのベンダーを達成するために違いがあるだろう、最も一般的なのHotSpot仮想マシンの開発者がより懸念しているだけでJVM規格されている:
1、仮想マシンのスタックは
、一般的にOutOfMemoryErrorがまたはにStackOverflowError、共通トリガをトリガそこコンストラクタ呼び出し自身、無限再帰、またはあまりにも多くのスレッド。
-Xssは、各スレッドのスタックサイズを設定します。各スレッドのスタックサイズ後JDK5.0は1Mです

メソッド領域は、図2に示すように、
OutOfMemoryErrorが発生サードパーティの依存関係ツリーが大きすぎるライブラリー、またはJSPの多数であってもよいトリガ、それは技術のダイナミッククラスの多くを生成したCGLIBバイトコードフレームワークのように使用してもよいです。
ウェイ領域で使用される世代の回復技術ので、長い時間のためのホットスポット、メソッド領域はホットスポット永久世代として近似することができます。
JDK8後、彼はフリースペースのメタスペースを使用し、永久に代わっPermGenを与えています。
オリジナルXX:PermSizeを及びXX:MetaspaceSizeと-XX:MaxPermSizeをも-XXに変更したMaxMetaspaceSize
指定されたサイズオプション上記の二つのInの添加、GCと関連する2つの属性がある:
  -XX:MinMetaspaceFreeRatio、GC後は、ガベージコレクションのために割り当てられたスペースを削減最小パーセンテージメタスペースの空き領域の容量が、引き起こさ
  MaxMetaspaceFreeRatioは、GC後、メタスペースの残りのスペースの最大量の割合は、ガベージコレクションは、結果の放出のためのスペースを低減:-XXは

3、ヒープ
、スタックおよびメソッド領域に比べて、開発者のためのスタックがより身近になり、ここでは、最も可能性の高いOOMを作成する場所です。
私たちは、あなたがオブジェクトリサイクルするかどうかを実現できるようにする場合は、通常、次の2つのオプションを考える:
1カウンタがインクリメントされ、一度、参照カウント方法、オブジェクトが参照され、このアプローチは、A、Bのように、各オブジェクト参照の状況を解決することはできませんこれは、リサイクルが、カウンタが1となるように、互いに相互に参照するが、回復できないことができます。
2、ルート検索アルゴリズムは、オブジェクトは、GCのルーツとして再利用することができない何基準関係をリサイクルされていない、参照が緊迫した状況とヒープメモリの決定の関係の強さとの間の現在の関係が存在します。Javaで徐々に弱め4つの基準強度続いて強い参照、ソフト参照、弱参照、ファントム参照が、存在します。基本的なアルゴリズムを使用して近代的なJVM。

マクロの使用は、ルート検索アルゴリズムが決定されているが、微視的には、各オブジェクトをリサイクルし、どのように?

1、マーク-スイープアルゴリズムは
、他のコレクションアルゴリズムは、この考え方に基づいており、クリアアルゴリズムは、最も基本的なコレクションアルゴリズムでラベルされました。統一されたクリアオブジェクトの終了をマークし、その後、オブジェクトを回復する必要がある最初のマーク:クリアラベル付けアルゴリズムは「マーク」と「クリア」2つの段階に分けています。
その主な欠点は:
。①マークとスイープ処理効率は高くありません。
標識はクリア後②。個別のメモリの断片化の多数を演出します。

図2は、アルゴリズムコピー
それは利用可能なメモリは、等しいサイズの2つのに分割され、それらの一方のみを使用します。この1つがなくなると、それはまた生きているオブジェクトは、上記の別のものにコピーされ、その後再び秋根拠にメモリ空間を使用されてきました。メモリ、簡単、効率的な動作を割り当てるために、モバイルセットスタックポインタ限りたびに回収されるメモリのブロックは、ケースは、破片を生成しないようにします。生き残るための唯一のいくつかのオブジェクトの状況に適用できます。
主な欠点:メモリが半分に減少しています。

3、マーク-照合アルゴリズム
マーキング操作と「マーク-クリア」コンセンサスアルゴリズムだけでなく、直接フォローアップ操作は、オブジェクトをクリーンアップするが、すべてのライブオブジェクトが最後に移動されているゴミを掃除した後、オブジェクトが完了し、その参照ポインタオブジェクトを更新します。ほとんどのライブオブジェクトの状況に適用できます。
主な欠点:マーク-明確な、比較的高いコストに基づいてオブジェクトを移動する必要があり、メリットはフラグメントメモリではありません

Javaでオブジェクトのほとんどは、生成後すぐにゴミになるだろう。異なるライフサイクルのオブジェクトは、さまざまな収集方法を取ることがあります。
現在市販されている仮想マシンの基本的に使用しているので、
世代別ガベージコレクションアルゴリズムの
ヒープ領域が古いと若い世代の分割され
若い世代エデンのエリアに分けられ、2つのサバイバーエリア:ゾーンとToゾーンから
若い世代のガベージコレクションの効率のために旧世代よりもはるかに高い、新しい世代、コピーアルゴリズムを使用して、直接標識する旧世代のために-ソートアルゴリズム。

通常の状況下では、新しく作成されたオブジェクトは、後に、これらのオブジェクト最初のマイナーGC後、エデンエリア(ラージオブジェクトを扱う特別の一部)に割り当てられている、まだ生きている場合は、サバイバーの領域に移動されます。サバイバーは、毎回マイナーGCを介して取得するエリア内のオブジェクト、それがある程度で、それは古い世代に移動されます年齢を1歳の年齢を増加します。
若い世代のオブジェクトは、若い世代のガベージコレクションアルゴリズムの使用が複製アルゴリズムであるので、アルゴリズムの基本的な考え方は、唯一のたびに、二つにメモリをコピーすることで、死(80%)に向かって基本的に生の夜であるため、請求これは、メモリが不足すると、別のものにコピーされたオブジェクト上生きているであろう。レプリケーションアルゴリズムは、メモリの断片を生成しません。

若い世代マイナーGC、またはメジャーGCの旧世代、あるいは全GC全体のヒープ領域はいずれも、すべてのアプリケーション・スレッドを停止し、停止ザ・ワールドの原因となります。掃除の時にあなたのお母さんを考えて、あなたは地面にゴミを投げる停止するつもりはないですか?時間はあなたがゴミを出してみましょうしていない場合でも、よくあなたの生活に重大な影響を与えるかもしれ、スイープに失敗することはできません、あなたはゴミを投げることができない、どのようにバランスをとるには?ここでは具体的なガベージコレクタの達成です。

シリアルコレクター
シリアルコレクタは、長い休止の原因と回復に一つだけのスレッドを使用することができ、最も古く、最も安定とコレクタの高効率です。新生代歳シリアル・リカバリ、レプリケーションアルゴリズムの古いマークの新世代-仕上げ; 'ストップザ・ワールド(サービスの一時停止)ごみ収集のプロセスLL。素人の面ではということであるあなたのお母さんが床を掃除、あなたがスローするように続け、Saowanをゴミを捨てないでください。
制御パラメータ:-XX:+ UseSerialGCシリアルコレクタ

ParNewコレクタ
ParNewコレクタが実際にマルチスレッド・バージョンシリアルコレクタであり、マルチコアの使用は、コンピュータの回収速度を向上させます。古いパラレル、シリアル年間の新世代、複製アルゴリズムの古いマークの新世代-仕上げ。素人の面では、それはということで、あなたのお母さんは、いくつかのヘルパーは一緒に床を掃除見つけ、あなたが投げるし続け、掃引中Saowanをゴミを捨てないでください。
制御パラメータ-XX:+ UseParNewGC ParNewコレクタ
-XX:ParallelGCThreadsは、スレッドの数を制限します

パラレルコレクタ
並列スカベンジコレクタ類似ParNewコレクタ、パラレルコレクタは、より多くのシステムのスループットを懸念しています。適応ストラテジパラメータで開くことができ、現在のシステムの操作に応じて収集された情報を監視する仮想性能は、これらのパラメータは動的に最適滞留時間又は特定の最大値を提供するように調整され、GCパラメータも超えない時間によって制御することができます何ミリ秒、または割合;複製アルゴリズムの古いマークの新世代-仕上げ。素人の面ではそれはということであるあなたが母親をクリーンアップし、それらを毎回掃除するのに長い時間が与えられ、短すぎるスイープがきれいああではない可能性がありすることができます!
制御パラメータ:-XX:+ UseParallelGC使用してパラレル・コレクターズ・旧シリアル+

オールド・コレクタを並列
アルゴリズム-パラレルスカベンジコレクターの古いの古いバージョン、マルチスレッドおよび「仕上げマーク」の使用をパラレル。このコレクションには、中にJDK 1.6でしか入手できない
パラメータ制御:-XX:+ UseParallelOldGCはパラレルのパラレル古いコレクタを使用して+

CMSコレクタ
CMS(並行マークスイープ)が最短復旧時間目標ポーズコレクターのためのコレクタです。現在のJavaアプリケーションサーバの大部分は、このようなアプリケーションやサービスの応答速度を中心に、インターネットサイトやB / Sシステムに焦点を当て、最短は、システムがユーザーに優れた体験を提供するために、一時停止します。
名前(含む「マークスイープ」)から、CMSコレクタが基づいている見ることができます-より複雑にしたいいくつかのコレクターのフロントに関して「マークスイープ」アルゴリズム、およびその動作方法、プロセス全体が分かれています:を含む4つのステップ、
初期マーク(CMS初期マーク)
並行マーク(CMS並行マーク)
の発言(CMSの発言)
同時クリア(CMS同時スイープ)
初期マーカーは、まだ「ストップザ・ワールド」に必要なこれらの2つのステップを発言します。最初のマークがちょうどによるマークを主導し、ユーザプログラムの継続的な操作に、コンカレントマークフェーズが進捗GCのルーツにトレースされ、再マーク位相補正が並行マーク中にためにある、非常に高速で、GCのルーツに直接リンクすることができますどのようなオブジェクトをマーク農産物オブジェクトの一部を記録マークの変更、通常は少し長い初期マークフェーズのいくつかよりも、この段階での滞留時間が、同時マーク時間よりも短いです。
全体のプロセスは最長同時マークと同時除去プロセスがかかるため、コレクタスレッドはユーザスレッド、CMSコレクタはユーザスレッドを同時に実行することがあるので、一般的に言えば、メモリの回復プロセスで動作することができます。歳コレクタ(新生代使用ParNew)。素人の面であります彼らはあなたを聞かせて、フロントにマークしていなかった、あなたは(このプロセスは非常に短い)ゴミがマークされている全ての部屋に来て、あなたは、彼らが(このプロセスは、非常に長いです)側縁スイープに進みゴミを投げ、その後、彼らはあなたを聞かせて新しいごみをマークする(このプロセスは非常に短くもある)、そして最後に、あなたが戻ってくると、あなたは、彼らが行われているマーキングごみを一掃ゴミをスローするように続けさせます。目標は、あなたができるだけ短く余地を残して時間を作ることです。
長所:同時コレクション、低ポーズの
欠点:スペースデブリの大量同時相は、スループット低下します
パラメータ制御を-XX:CMSコレクタ使って+ UseConcMarkSweepGCを
-XXを:UseCMSCompactAtFullCollection全GCの後に+を、デフラグ後、仕上げのプロセスが排他的です、それは長い休止時間が発生します
。-XX:+ CMSFullGCsBeforeCompaction設定数回のフルGC、デフラグ後
-XX:ParallelCMSThreadsは(利用可能なCPUの数にほぼ等しい程度)CMSは、スレッド数を設定します

コレクターG1
G1は現在、最先端の技術開発の成果の一つであり、HotSpotのチームの使命はそれをCMSコレクタで公開されJDK1.5を置き換えることができ、将来を与えることです。これはG1のコレクタとコレクタCMSに比べて以下の特徴を有します。

  1. 空間統合は、G1コレクタは、アルゴリズム、無メモリスペースデブリを整理するためにタグを使用しています。彼らは、大きなオブジェクトの割り当てによってトリガ時間のGC連続空間の先を見つけることができないではないので。
  2. 滞留時間は、一般的なCMSとG1の懸念が、低一時停止の追求に加えて、G1で、休止時間モデルが予測を確立することができます削減、もう一つの大きな利点のG1で予測可能な一時停止は、ユーザーがで指定することができますセグメントの時間長は、ガベージコレクタのほぼリアルタイムのJava(RTSJ)を特徴とするNミリ秒を超えてはならないガベージコレクションで消費Nミリ秒です。
    新世代の全範囲の収集、上記のガベージコレクタは、歳以上ではない、とG1はもはやケースです。G1コレクタを使用する場合、他のコレクターとのJavaヒープメモリのレイアウトが非常に異なる有し、それは全体のJavaヒープであろう概念は新世代と老年をも保持しているが、同じサイズの複数の独立した領域(地域)に分割されていますしかし、新世代と旧年は、もはや物理的なギャップではない、と彼らは、コレクションの地域の一部である(またはしないかもしれ連続)。
    新世代の占有率が一定の割合に達すると同様のParNew、と新世代のG1コレクションは、コレクションをスタートしました。そして、同様のCMSは、G1のコレクターのオブジェクトは、古い短い休止を収集することです。
    素人の面ではそれがあることである(例えば、最も簡単な汚い下記の机など)さまざまなホットスポットがカトン時間をクリーンアップに焦点を軽減するために、あなたの部屋は、CMSのアルゴリズムを除いて、大きすぎるので、あなたの部屋の奥には、領域を分割しました。

一般的な構成の概要
スタックが配置された
初期ヒープサイズ:-Xmsを
-Xmx:最大ヒープサイズ
-XX:NewSizeパラメータ=をN:若い世代のサイズ設定
-XX:NewRatio =をN:若い世代と旧世代の比率を設定します。例えば:1の旧世代比に若い世代を示す3、3、若い世代の合計の若い世代と旧世代1/4
-XX:SurvivorRatio = N:エデン若い世代領域と二つの領域サバイバー比率。2つのサバイバー領域があることに注意してください。例えば:3、エデンを発現:サバイバー= 3:2、総面積サバイバー若い世代1/5
-XX:MaxMetaspaceSize:空間設定要素(JDK8以降)
コレクタ設定
-XX:+ UseSerialGC:セットストリング行コレクター
-XX:+ UseParallelGC:設定パラレルコレクター
-XX:+ UseParalledlOldGC:設定パラレル古い世代コレクタ
-XX:+ UseConcMarkSweepGCを:セットの並行コレクタ
ガベージコレクション統計
-XX:+ PrintGC
-XX:+ PrintGCDetails
-XX:+ PrintGCTimeStamps
-Xloggc:ファイル名の
平行に配置されたコレクタ
-XX:ParallelGCThreads = N:収集平行に配置コレクタに使用されるCPUの数。スレッドの数を収集するために平行です。
-XX:MaxGCPauseMillis = N:最大停止時間を収集すること並列に設けられています。
-XX:GCTimeRatio = N:時間のガベージコレクションのパーセンテージ時間を実行しているプログラム。式1 /(1 + N)
同時コレクタ配置さ
-XX:+ CMSIncrementalMode:モード設定刻み。単一CPUの場合について。
-XX:ParallelGCThreads = N:同時コレクタが収集並列CPUの数は、使用される場合、若い世代モードを収集するために設けられています。スレッドの数を収集するために平行です。

ユーティリティJDKが提供
Jinfoの:Javaランタイム環境パラメータをプログラムを実行している観測:パラメータは、JavaシステムプロパティとJVMコマンドライン引数、Javaクラスパスやその他の情報が含まれています。フォーマット:Jinfoのプロセスのpid
JPS:あなたはローカル実行しているいくつかのJavaプログラムを表示し、それらにプロセスIDを表示することができ、ローカルのJavaプロセスを表示します。フォーマット:JPSのJPSまたはリモートサービス(デフォルトポート1099)のIPアドレス
JSTAT:強力な監視VMメモリツール。VMのメモリに非ヒープ及びスタックサイズとメモリ使用量の多様を監視するために使用することができます。
jstack:現在の動作が観察され、JVMの現在の状態のすべてのスレッドをスレッド化することができます。プログラム今すぐ実行するJavaのプレゼンテーションの状態がハングした場合、jstackは非常に便利です。フォーマット:jstack pidのプロセス
のコマンドを使用してプログラムすると、デッドロックが発生します。jstackプロセスID> jstack.log、その後、jstack.logファイルは、「ブロック」のキーワードで検索、ローカル原因のデッドロックに移動します。
占有JVM物理メモリ(例えば。、::オブジェクトとその番号が生成される)の動作を観察jmapの。フォーマット:jmapの[オプション] PIDの
オプションパラメータは、以下のとおり
-heap:印刷の場合、JVMヒープ
-histo:印刷JVMヒープヒストグラム。出力情報は、オブジェクトの数、オブジェクトによって占有サイズを、クラス名が含まれています。
-histo:ライブ:上記のように、だけライブオブジェクトの場合に同意
-permstat:永続世代ヒープケース印刷
jmapの使用の例は、ヒープ・ダンプを行う:jmapの-dump:フォーマット= B、 ファイル=
メモリーチャートを印刷:jmapの-histo:ライブ
各行が示す現在のスタックタイプの情報のバイトの各タイプの数の結果、実施例の数を含む、消費譲渡されています。オプションの「ライブ」、統計が唯一生き残ったオブジェクトが示す
発電チャートは必ずプログラムの停止が許容可能であることを確認する必要があるときにJVMがそう、中断することができるグラフを生成するときにjmapは、分析ツールを実行しないことに留意すべきです。
jconsoleを:監視ツールのJava GUI、各種データをグラフィカル形式で表示することができます。リモート・サーバを監視するリモートVMを介して接続することができます。
VisualVMは:あなたは、パフォーマンス分析およびJavaアプリケーションのチューニングを行う強力な分析を提供して自由に、統合いくつかのコマンドラインJDKツールの可視化ツール。これらの特徴は、分析を実行するために、ガベージコレクタ、メモリとCPUを監視し、メモリリークを追跡する、大量のデータの生成および分析を含むが、それはまた、MBeanの閲覧及び操作をサポートしています。

:原因の必要性のGUIをjconsoleをしてVisualVMは、一般的にオンラインサーバー上で直接実行することはできません。しかし、より直感的になり、以前のいくつかのツールと比較。あなたがまだ分析の難しさがあると感じた場合、ローカル分析にダンプ・バックと考えることができ、あなたが原因を見つけるためにいくつかのツールのフロントラインの組み合わせを使用することをお勧めします。

概要:一般的に使用されるJVMガベージコレクションのアルゴリズムは、常に、限り、あなたはあなたの人生の観測に勤勉されているように、実際の応用例では合計で良いを見つけることができます。

おすすめ

転載: www.cnblogs.com/mzsg/p/11975883.html