JavaのJVM基本的な知識

1.JMM Javaのメモリモデル

   各スレッドは、独自のワーキングメモリを持っている[ワーキングメモリ]
   メインメモリ変数のコピーのコピーを保存するためのメモリを作業のスレッドは、スレッドによって使用されています
   変数のすべてのスレッド間のスレッドが直接他の変数のワーキングメモリにアクセスすることができない、スレッド間で渡された変数の値は、メインメモリを完了するために必要とされています。

 2.javaヒープとスタック

1)スタックヒープ:動的に割り当てられたメモリ空間(メモリ空間フリーレコードリストは、オペレーティング・システムによって維持されます)。       

    必要とされない場合、メモリは、新しいメモリ要求に割り当てる、回収することができる前記 メモリデータが乱れています
    一般に自由に、mallocのヒープが割り当てられ、ユーザによって手動で解除する必要が割り当てられます。
    仮想マシンが起動し作成したメモリ領域内のすべてのスレッドで共有され 、このメモリ領域の唯一の目的は、オブジェクトのインスタンスを格納しています

2)スタックスタック:最後のアウトデータ構造、ローカル変数のパラメータ(機能)を格納するための通常の方法;.

    Javaでは、すべての基本的な基準の種類は、現在の生活空間一般スコープ({...}囲まれた領域である)に、スタック内のスタックデータに格納されています;

     最初に割り当てられたメモリが解放されなければならないの後
    一般的に、関数のパラメータ値を格納し、システムによって自動的に割り当て、ローカル変数は自動的にクリアされます
3.スタックローカルエリア方法
 1)メソッド領域法エリア:Javaヒープおよび非ヒープ(非ヒープ)と呼ばれるような、別名、各スレッドは、共有メモリ領域です。
          これは、店舗のクラス情報に使用され、仮想マシン、定数、静的変数、コードやその他のデータをコンパイルする時間コンパイラがロードされています
  ランタイム定数プールランタイム定数プール:メソッドの一部領域と、         
          クラス、フィールド、メソッド、およびインターフェース記述情報に加えて、クラスファイルバージョン情報でもある 一定のプール(定数プールテーブル)、及び様々なリテラルシンボルを格納するための生成された基準をコンパイルし、この部分クラスがロードされた後、時定数のプール領域に格納されたコンテンツの操作方法
2)ネイティブメソッドスタックのネイティブメソッドスタック:ネイティブ方式サービスへの仮想マシンの使用
    注:JVM組成

 4 。JVMランタイムデータ領域

  プログラムカウンタ:小さなメモリ、現在のプログラムが実行レコードがあります。

      バイトコードインタプリタを作業することで、実行すべき次の命令を選択するためのカウンタのバイトコードの値が変更することで、ブランチ、ループ、分岐、例外処理、および完全にこの返信スレッドカウンターに頼るので、必要性を。

       スレッドはメインメソッドを実行している場合、カウンタは、実行中の仮想マシンのバイトコード命令のアドレスを記録します。

      あなたが実行している場合、ローカルの方法で、カウンタの値が空でした。

      Java仮想マシン仕様で唯一のは異常事態の任意の領域を指定していないのOutOfMemoryError

 残りを参照して図2及び図3

 4.GC

  GCガベージコレクション:自動的にできるオブジェクトは、自動的にメモリを再利用の目的を達成するための範囲を超えています

オブジェクトの回復を決定する方法5.

 1)モーゲンソーアルゴリズム:各オブジェクトがルートノードとして見られるルートオブジェクトであるGCルーツ、オブジェクトから、あるいはルート・オブジェクトからのルートオブジェクトに到達するパスが存在しない場合、到達不能であるオブジェクトへの参照とすることができませんの

      GCのルーツオブジェクト:

    仮想マシン内のオブジェクト参照(ローカル変数テーブルスタックフレーム)スタックは、メソッドごとに行わ、JVMは、オペランドスタック、ローカル変数テーブル、実行時定数プールを含む対応するスタックフレーム(スタックフレームを作成し参考文献を参照のこと);

        方法ゾーンクラスは、これらの例のいずれにも属さない、静的プロパティ(静的キーワード)によって参照されるオブジェクト。

     オブジェクトメソッド(キーワード静的決勝を使用して)地区定数参照。

            ネイティブメソッドスタック(ネイティブ・スタック)基準オブジェクト、ネイティブを使用して、JNI技術の方法

 2)参照カウント(現在は使用されません)

   走査中のオブジェクトインスタンスの場所への参照が存在し、このオブジェクトのインスタンスが1だけインクリメントされる操作のJava、参照が失敗時間をデクリメント、JVMメモリは、基準カウント値は、ガーベッジオブジェクトであることが判明したカウント値がより大きい場合、0でありますアクティブオブジェクトと比較して0

6.Javaメモリリーク

   実際の開発では、役に立たないが、到達可能なオブジェクトがあるかもしれない、これらのオブジェクトはGC回復することはできませんので、メモリリーク(OutOfMemoryErrorが発生)につながります
   一般的なメモリリーク:
     オブジェクト1)参照の短いライフサイクルを保持する長いライフサイクルは、メモリリークが存在することになる可能性があります
パブリック クラスのテスト{ 
    オブジェクトオブジェクト、
    公共 ボイド試験(){ 
        オブジェクト = 新しい新しいオブジェクト();
         // ...他のコード
    } 
}

 2)静的の最も可能性が高いが発生するなどのHashMap、ベクターを使用して、メモリリークのようなコレクション、およびこれらの静的変数のライフサイクル一貫性のあるアプリケーションは、すべてのなど、彼らは常にベクトルに適用されるので、オブジェクトを解放することができないオブジェクト

   3作業)オブジェクト内の属性セットが変更されると、呼のremove()メソッドはありません。

   4)接続、データベース接続、ネットワーク接続のすべての種類は、IO接続が閉じる閉じるコールを表示されない)、(接続が自動的にいつでも回収することができないが、回収された接続の後、結果セットおよび文オブジェクトが直ちにNULLであろう。

   注:静的変数、ライフサイクルとクラスクラスの静的変数同期の使用を最小限に抑えます。

    クリアかつ効果的なスコープメモリオブジェクト。

    様々な接続(データベース接続、ネットワーク接続、IOコネクタ)操作は、必ず表示コール近いオフにします。

    オブジェクトは、それがクリーンアップを開始する時期に関係なく、GCの、私たちはタイムリーにする必要があり、NULL値を使用せずに手動で設定されているために洗浄すべき対象としてマークされた無用のオブジェクトになります

7.JVMガベージコレクションアルゴリズム

   ヒープ内のJavaオブジェクトは、古いものと新しい世代の分割され

 1)マーク-スイープアルゴリズムマークスイープ:まず必要が完了マーク後の回復をマークされたすべてのオブジェクトを統一、オブジェクトを回復する、しかし、洗浄工程のマークと効率はそれが不連続後に明確なマークを大量に生成されます、高くありませんメモリの断片化

        

  2)マーク - 照合アルゴリズムマークコンパクト:最初のマークすべてリサイクル可能なオブジェクトおよびライブオブジェクトが終了境界以外のダイレクト・メモリを一掃そして、一方の端部に向かって移動してみましょう

        

  3)コピーコピー:すべてのオブジェクトのスキャンJVMが、ルート検索アルゴリズムによって参照されるオブジェクトをマーク、そして、新しいメモリ空間に適用する新しいメモリ空間にマークされたオブジェクトをコピーします、ライブオブジェクトがコピーされ、それがオリジナルをクリアしますメモリ空間、新しいメモリほとんどのJVMオブジェクト・ストレージ・スペース、しかし、メモリのコストでは、元の半分に減少し 

    

 4)回収世代

      JVMの共通世代コレクションアルゴリズムは、回収された主なアルゴリズムをマークするために、古い年終え、コピーアルゴリズムをベースに、若い世代を

      若い世代は、よりオブジェクトで、各ガベージコレクションは、ガベージオブジェクトの多くは、オブジェクトの短いライフサイクルを短縮するために、可能な限り迅速に回収され、た、オブジェクトは限りオブジェクトのコピーフラグは、別のメモリ領域に存在しているとして、小さい生きています残りすべてをクリアし、複製の数が少ない、高効率。

     オブジェクトを遮蔽する歳若い世代、オブジェクトはあまり明らかに高い効率で仕上げマークされて削除されます

8.JVMガベージコレクタ

コレクターの新世代:シリアル、ParNew、パラレルの清掃

歳コレクター:CMS、シリアル旧、パラレル旧

ヒープ全体のコレクター:G1

並列コレクションは:パラレルガベージコレクション内のスレッド数を指しますが、この時間は、ユーザスレッドは待機状態のままです。

同時コレクション:(必ずしも平行に交互に行うことができるではない)、同時にユーザスレッドとガベージコレクションのスレッドの作業を指します。ユーザプログラムの実行を継続し、ガベージコレクションプログラムは、別のCPU上で実行されています。

スループット:合計時間の割合は、CPU時間を消費し、CPUは、実行ユーザコード(時間+時間のガベージコレクションを実行して、一定時間= /(ユーザコードを実行するためのユーザコード))に使用されます。たとえば、次の100分の合計を実行している仮想マシン、ガベージコレクタは、次いでスループットが99%で、1分を費やします

 1)シリアルコレクタ

     シリアル;

     コピーガベージコレクションアルゴリズムを使用してシングルスレッドコレクタの新世代のために、

  だけでなく、スレッドを行うガベージコレクションによって、シリアルガベージコレクションが、それは同時に収集すると、すべてのユーザー・スレッドが中断されなければならない(ストップザ・ワールド)

    クライアント・モード、シングルCPUの仮想マシンに適用されます
   

 2)ParNewコレクタ

    シリアルは、マルチスレッドバージョンであり他方はシリアルとの違いはありません。

 コレクションの同じ数はデフォルトで有効になっており、CPU環境の多くのCPUスレッドの数は、あなたが-XX使用することができますガベージコレクションのスレッド数を制限するParallelGCThreadsにパラメータを。

    ストップザ・ワールドの存在;

  多くのシリアルコレクタに加えて、サーバーモード、コレクターの新世代下の仮想マシンで実行することが好ましい、現在唯一のCMSコレクタで動作します

  

 3)並列スカベンジコレクタ

   コピーアルゴリズムコレクタを使用するだけでなく、並列、マルチスレッドコレクタ。

  ParNewとの違いはParNewの目標は、ガベージコレクションの休止時間のユーザスレッド、ときできるだけ短くすることですパラレルスカベンジ目標はスループットに到達することであるが、制御することができます

  GCの適応:-XX:+ UseAdptiveSizePolicyオープン

      XX:特定の精度を制御するための2つのパラメータを提供MaxGCPauseMillisは、最大停止時間のガベージコレクションを制御します 

                  XX:GCRatioサイズは直接計算スループットに配置されている:1 /(1 + N)

 4)シリアル旧

       シリアル古いのバージョンでは、マークを使用して、また、シングルスレッドのコレクターである - 照合アルゴリズム。

  用途:JDK1.5および以前のバージョンでパラレルスカベンジコレクタと組み合わせて使用​​します。

     バックアップ計画CMSコレクタとして、

 5)パラレル古いです

     パラレル清掃を古いバージョンでは、マルチスレッドのコレクション、マークの使用である - 照合アルゴリズム。

  JDK1.6はパラレルスカベンジコレクタで使用できるパラレルオールド・コレクターを持っています。

 JDK1.6以降では、古いコレクタのシリアル・旧の代わりに使用します

   

 6)CMS(並行マークスイープ)

     マークに基づいて、最短目標復旧時間ポーズコレクターについて - スイープアルゴリズム、コンカレントコレクション、低一時停止。

  JDK1.5で導入しました。

  CMSのメモリの回復は、ユーザスレッド「同時性」と連動して行われます

  実行中のプロセス:

          1)初期マーカー:ストップザ・ワールド、唯一の最初のGCのルーツマークオブジェクトをマーキングが直接、非常に高速にリンクすることができます。

          2)同時マーク:GCのルーツは、プロセスの追跡、及び同時に閉鎖構造を、GCスレッドオンユーザがライブオブジェクトを識別するために到達可能なオブジェクトを記録するために、ユーザのスレッドが同時に実行することができます。

          3)再マークされたユーザプログラムは、複数のスレッドを使用して、オブジェクト変更(マーク記録部分)が効率を改善するために並列に実行することを産マークに導か補正並行マーク中に実行し続けるために、オリジナルよりも「ストップザ・ワールド」を必要とし、休止​​タイムスタンプ長いが、並行マークよりも短いです。

          4)同時クリア:GCスレッドは、すべてのゴミオブジェクトのリサイクル、マークされた領域のためのクリーニングを行うには開始している間、ユーザスレッドを開きます

      

    短所:CPUリソースに非常に敏感で、 - それは大規模なオブジェクトで、その結果、スペースデブリの問題になりますスイープアルゴリズムは、スペースを割り当てることができないではなく、マークの使用のために、ゴミが同時モデルの失敗の障害が他の全GCを生成する原因と思われるかもしれ浮動扱うことができませんノー事前トリガーのフルGC

 7)G1(ガベージ・ファースト)

     jdk1.7正式JDK1.9の商業コレクタは、デフォルトのコレクタとなっている引用。

     GCの非常に高い確率休止時間が要件を満たすだけでなく、一定の高パフォーマンス特性を持っています。

  特長:

        1)平行かつ同時:ハードウェアのG1完全な利点は、CPU(CPUまたはCPUコア)の複数の使用が停止世界休止時間を短縮するために、CPU、マルチコア環境であってもよいです。他のコレクターの中には、そうでない場合は、GC一時停止アクションJavaスレッドの実行が必要になり、G1コレクタはまだ並行プログラムを通じて、Javaが実装され続けたことができます。

   2)世代のコレクション:

    ;あなたは、独立して、他のコレクターと混合することなく、全体のGCヒープ(古いものと新しい世代の)を管理することができ
    、異なる時間に異なる方法で処理することができ、
    世代のコンセプトを維持しながら、しかし、Javaのヒープメモリレイアウトは非常に異なっています。
    スタック全体等しい大きさ(領域)の別個の複数の領域に分割され、
    新生代歳、もはや物理的に分離されていない、それらは部分領域(必ずしも連続していない)が設定されている;
  3)空間的統合。

             全体的に、それはマークに基づいています - 照合アルゴリズム。

  •   見て(2地域間の)地元からは、複製アルゴリズムに基づいている:なしメモリの断片化は、それが長時間実行に資するではありません。

       4)予測が一時停止することができ:G1ポーズ以外ローを追求し、休止時間も予測モデルを作成することができ; Mは、明示的にミリ秒のタイムスライス内で指定することができ、時間ガベージコレクションを消費は、Nミリ秒を超えません

                                地域全体で全体のJavaヒープガベージコレクションを避けるために、計画、優先順位のリストを維持するために、バックグラウンドでG1の各地域内の積み上げごみのサイズを追跡し、毎回の許可を収集するために応じて、優先度の回復値の最大領域と、このあなたは、限られた時間内にその収集効率を確保するために、できるだけ高いとして取得することができます

    どのようにスタック全体をスキャンG1の回避は:G1各領域は、対応する思い出しセット,,発見手順の参照型の書き込み時に仮想マシンを持って、書き込みバリア一時的に中断し、書き込み動作が生成されます、参照をチェックするリファレンスオブジェクトリージョンは、複数のである(つまり、オブジェクトは新しい世代で参照されているかどうかを確認するために、古い年)、そうであれば、参照されるオブジェクトが属する思い出しセットの領域に記録、その後CardTableによって、関連する参照情報。メモリの回復は、列挙型の範囲GCのルートノードに設定を思い出し追加する際に欠落しているフルスタックのスキャンがないことを保証することはできません。

     一般的なプロセスを実行します。    

           初期マーク:ユーザプログラムの次の段階を同時に実行するようにすることを直接オブジェクトにのみGCルーツマーク、およびTAMS(マーク・スタートで次の上位)の値を変更するには、地域での正しい利用可能で、新しいオブジェクトを作成することができます。(スレッドを一時停止する必要がありますが、それは非常に短くなります。)

          同時マーク:ヒープに始めるには、GCのルーツから到達可能性解析オブジェクト、ライブオブジェクトを見つけます。(それは長い時間がかかりますが、ユーザプログラムの実行によって複雑にすることができます)

          最後のマークは:生産変動への記録マークの一部につながった同時ユーザプログラム実行中に行われたマーク改正の結果をマークします。およびSETログ思い出しスレッド内のオブジェクトの変化を記録し、組み合わせ思い出しセットのログは、データ内の設定を思い出しました。(スレッドを一時停止する必要があるが、並行して行うことができます。)

          フィルターのリサイクル:リサイクル値とソートに各領域の費用は、GCの一時停止を希望するユーザーに応じてリサイクルプログラムを開発します。(同時に実行することができます)

9.ヒープメモリ部門
   異なるオブジェクトは、ライフサイクルは同じではありませんので、別の収集方法を使用して、異なるオブジェクトのライフサイクルは、ガベージコレクションの効率を向上させることができます 
   シリアル、シリアル、パラレルパラレル、およびCMS、ヒープメモリは、固定サイズの3つのセクションに分かれています。若い世代(若い世代)、旧世代(旧世代)、および永久世代(永久世代)

 

    1)若い世代若い世代

            オブジェクトの新世代          

           3つのゾーンに分割され、ゾーンエデン、エデン領域が一杯に、ライブオブジェクトもサバイバーエリア(1の2)にコピーされている地域エデンで生成されたオブジェクト、この領域があり、完全なサバイバーのほとんど、この領域が一杯になったときの領域上に第一サバイバーからコピーするときにこの領域でのライブオブジェクトは、サバイバー、サバイバーの別の領域にコピーされ、この時間も古い地区(終身在職権)にコピーされるオブジェクトが住んでいました         

          ノートは、対称であるサバイバー二つのゾーンから、関係がないので、同時に同じエリア上エデンからオブジェクトが存在し得る、前者サバイバーは、オブジェクトをコピーし、そして最初から古い領域にコピーサバイバーは、オブジェクトの上に行きます。また、生存者はチーフが空であるました

    一方、プログラムのニーズに応じて、サバイバー領域が配置されてもよい古い世代を低減するために、オブジェクトが若い世代に存在する時間を増加させることができる(3つ以上)の複数として構成されています

   2)旧旧世代

        オブジェクトの長いライフサイクル

        経験豊富なオブジェクトN回のゴミ回収は、若い世代にまだ生きているの後に、古い世代が配置されます

  3)永久世代永久生成

      それはそうで静的ファイル、および今のJavaクラス、メソッド、およびを格納するために使用されます。

     そこガベージコレクションの発生に有意な持続的な影響はなかったが、いくつかのアプリケーションは、などHibernateは、として、いくつかまたは動的に生成されたクラスを呼び出すことができます

10. DESCRIPTION世代別ガベージリサイクル

 1)エデン地区、新しく作成されたオブジェクト。

 エデンエリアを空にしながら、2)エデン)が一定の割合(一杯になると、ガベージコレクション(マイナーGC)をトリガーする、新しいオブジェクトを作成することはできません、S1として、無用のオブジェクトを一掃した後、サバイバーに残りのオブジェクトをコピーします。

 エデン領域が満杯再度ある場合、オブジェクトのエデン領域も、エデンを確保するためにS1、及びS1にコピーし、空にすることができないながら3)、オブジェクトのS1は、S2のように、他の記憶サバイバーに空にすることはできませんこれは、空です。
 4)を繰り返し何度も(デフォルト15)サバイバーが洗浄されていないオブジェクトは、古い年、古い世代の領域にコピーされます
 旧地区がいっぱいになると5)、それが引き金となり、完全なガベージコレクション(FullGC)一度、ガベージコレクションの新世代と呼ばれる前に(マイナーGC) 

  

おすすめ

転載: www.cnblogs.com/dxjx/p/12544717.html