ご不明な点は、JVMに行くことができます - ガベージコレクション

入門

  • リサイクルにどのようなメモリが必要?
  • ときに回復?
  • どのようにリサイクルするには?

Javaの参照型の話?

強い参照

   同様にObject obj = new Object()強い参照の種類は、限り、参照は依然として強いと、ガベージコレクタは、参照されるオブジェクトをオフに回復したことがありません。

弱参照

   オブジェクトは、非必須オブジェクトを記述するために使用され、その強度は、次のコレクションが発生するまでのみ生存する関連する基準よりも柔らかいです。ソフト参照が使用SoftRefrence表現するために。

偽の引用

   オブジェクトが参照された仮想プレゼンスを持っているかどうか、それは、オブジェクト参照の仮想インスタンスを介して取得することができない、その生存率には影響しません。JDK 1.2使用後PhantomRefrence表します。

弱参照

  弱参照は、以前に非必須オブジェクトを説明するが、その強度は弱く関連するオブジェクトのみが、次回まで、ガベージコレクタを生き残ることができる引用、ソフト参照よりも弱いJDK 1.2weakRefrence表明しました。

目的は、ガベージコレクションのですか?

  クリア参照は、もはや自動的に、使用されていないメモリを解放されます。

GCは、どのようにオブジェクトが再利用されるかどうかを判断するのですか?

  GCRoot、オブジェクトの場合GC Roots次のような基準との間には直接的または間接的に関係しません、

  • 任意のオブジェクト参照の損失
  • 二つの円形の島各参照オブジェクト

これらは、それがリサイクルすることができ、評決「執行猶予」をオブジェクト

GCのルーツがそうであるようにどのようなオブジェクトを使用することができますか?

  • クラスの静的プロパティは、オブジェクトを参照しました
  • const参照オブジェクト
  • VMのスタック参照オブジェクト
  • 参照オブジェクトのネイティブメソッドスタック

ガベージコレクションの相関アルゴリズムについての話?

  • マーク - スイープアルゴリズム

  それぞれのアルゴリズムGC Rootsの出発は、順番に参照オブジェクトの関係でマークされていない、そして最終的には何のオブジェクトがクリアさがマークされます。しかし、この方法は簡単にトリガ時間の大連続空間を割り当てる必要が生じ、スペースデブリの多くをもたらすでしょうFGC

  • マーク - 照合アルゴリズム

   デフラグのコンピューターのような最初のすべてのだろう、GC Roots開始マークライブオブジェクト、その後、ライブオブジェクト、その後、メモリ空間の一端に生きているオブジェクトを終え、連続空間を形成するには、スペースの合計クリーンアップの外側の最後の部分が使用されている、使用されています離れて、そのスペースデブリを発生させないように。

  • Mark-Copyアルゴリズム

  平行マークを整理することができるように、スペースがガベージコレクションがアクティブでない時の活性化は、単に別の空間に生存オブジェクトをコピーし、前記2つに分割され、不活性な空間がアクティブとしてマーク非アクティブとしてマークされたアクティブスペースは、その後、元のオブジェクトのスペースを削除します。
  ヒープメモリ空間を分割しEden、より小さな二つが非アクティブとして記録し、その後、元のメタオブジェクト・スペースを削除します。ヒープメモリ空間が大きくに分割されるEdenと2つのより小さいSurvivor、使用時間Eden及びSurvivor領域。この場合、Mark-Copy廃棄物のメモリ空間を削減します。
  Mark-Copy今主流のようYGCなアルゴリズムのガベージコレクション新世代。

あなたはガベージコレクタについて知っていることを教えてください?

  Seralリサイクルのための主要でYGC完了するガベージコレクタ、シリアルシングルスレッド方法GCタスクStop The Worldと呼ばれるSTWアプリケーションの実行を通じて、いくつかの段階で、そのガベージコレクションの休止を。FGC比較的長い時間が、多くの場合、FGC深刻なアプリケーションのパフォーマンスに影響します

  • CMS

アルゴリズム:

  マーク - スイープアルゴリズム、スペースデブリの大量

ソリューション:

   -XX: + UseCMSCommpactAtFullCollection = nn回のパラメータ、FGC後にJVM旧世代領域のデフラグの実行中に別の、スペースのデフラグを実行しますが、デフラグの位相空間は、につながりますSTW

ステップ:

  1. 初期ラベル(Inititalマーク)
  2. 並行マーク(並行マーク)
  3. ラベル変更(リマーク)
  4. クリア同時(並行マーク)
問題:

。Aの1,3:イニシエータSTW

ソリューション:
   低減するためにSTW回数を、GMSあなたも-XXを設定することができます:FGC + CMSFullGCsBeforeCompaction = Nパラメータ、後にn回、JVMその後歳のスペースデブリの実装でフィニッシュ。

。B 2、4:アプリケーションを同時に実行できるだけでなく、より時間のかかる操作を、しかし、政策実施のアプリケーションには影響を与えません。


  • G1

ホットスポットはJDK7の中で新世代を導入しG1て、ガベージコレクション-XX: + UseG1GCの起動パラメータ。そして、CMS比較してG1圧縮して、破片、回避するために、G1より制御休止時間を、全体的なパフォーマンスが良いです

新しいものは、オブジェクトをしましたか?

   Javaクラスに応じて、オブジェクト指向の静的強く型付けされた言語、宣言し、非常に一般的なオブジェクトを作成するには、作成されたオブジェクトを指す参照変数を宣言し、オブジェクトを操作するには、この参照変数、それは新しいでやった主題を使用していますか?

バイトコードの角度:

1。NEW
  • あなたは見つけることができない場合はClass、オブジェクトのクラスのロードが行われます
  • ロードが成功した後、から、ヒープに割り当てられたメモリは、Objectローカルパス上のすべてのプロパティの先頭にメモリを割り当てる必要があります
  • メモリ割り当ては、0の初期値を完了する
    • 参照変数の値である記憶空間、4つのバイトを占め
      • これは、仮想マシンのスタックスタックにインスタンスオブジェクト参照変数に実行されます
2。DUP
  • スタックは小数点スタック参照変数内のオブジェクトの2つのインスタンスを有する場合、スタックの参照変数のトップにコピーします。
    • メソッドにパラメータがある場合は、パラメータもプッシュ操作をスタックする必要があります。割り当てのための底の基準に圧入される二つの異なるオブジェクト参照変数、
    • またはローカル変数テーブルに保存され、スタック・ハンドルなどの別の基準変数は、関連するメソッドを呼び出します。
3. INVOKESPECIAL
  • オブジェクトのインスタンスを呼び出し、参照変数のスタックを介しメソッドを呼び出します。クラス初期化メソッドは、実行の初期化方法を行うが、オブジェクト。

ステップ角を実行します。

1.確認クラシファイア情報が存在します。
  • ときにJVM受けnewた命令を、最初のmetaspaceクラスのチェックが存在するメタ情報を作成する必要があります

    • もしそうでなければ、両親おまかせ派閥モードでは、現在のクラスローダを使用してClassLoader+パッケージ名+クラス名Keyに対応する検索し.classたファイルを
      • 見つからなかった場合は、投げますClassNotFoundException
      • 見つかった場合、クラスローダが実行され、対応する生成されたClassオブジェクト。
2.割り当てられたオブジェクト:
  • オブジェクトのメモリフットプリントを計算します
    • インスタンス変数は、参照メンバ変数である場合、分配空間は、変数を参照することができる、すなわち、新しいオブジェクトをヒープ内のメモリの分割に続く4バイトのサイズ、
    • このような使用のようなメモリ空間、同期動作の必要性、割り当てる際CAS分配操作原子のロック領域を確保する等の故障の再試行を、
3.デフォルト値を設定します。

  メンバ変数の値がデフォルトビット値、値0の様々な形態を設定する必要があります

4.オブジェクトヘッダを設定します。

  新しいオブジェクトのハッシュコード、GC情報、ロック情報を設定し、メタオブジェクトは、クラス情報等に帰属します。このプロセスの設定が依存するJVM実装。

initメソッドが実行さ:

  メンバ変数の初期化、例えばコードブロックの実行は、この方法は、クラスのコンストラクタ、第1基準変数にスタックアドレス内のオブジェクトの割り当てを呼び出します。

おすすめ

転載: juejin.im/post/5dfccc5a6fb9a01616436517