仮想マシンシリーズ|実行エンジンとガベージコレクション

1.実行エンジン

アプリケーションプログラムはコンパイルされ、バイトコードファイルに変換されます。メモリ空間にロードされたバイトコードは、オペレーティングシステムで直接実行することはできません。実行エンジンはJava仮想マシンのコアの不可欠な部分です。その機能は/を解釈することです。バイトコード命令をにコンパイルします。システムプラットフォーム上のローカルマシン命令に対応します。

インタプリタ:仮想マシンが起動すると、事前定義された解釈に従ってバイトコードが1行ずつ実行され、各バイトコードファイルの内容が対応するシステムプラットフォームのローカルマシン命令実行として解釈されます。

JITコンパイラ:仮想マシンは、ソースコードをローカルマシンプラットフォームに関連するマシン言語にコンパイルし、ホットで高頻度の実行コードを見つけて、メタスペース、つまりメタに格納されているJITキャッシュコードに配置します。スペース;

ガベージコレクション:参照がないオブジェクトはガベージとしてマークされ、メモリスペースを解放するためにリサイクルされます。

2、ゴミオブジェクトマーク

1.参照カウント方法

各オブジェクトは、オブジェクトが参照された回数を記録するために使用される整数参照カウンターを格納します。オブジェクトがオブジェクトによって参照されると、カウンターは1増加し、参照が失われると、カウンターは減少します。 1.参照カウントアルゴリズムは、オブジェクトを判断することによって決定されます。参照の数は、オブジェクトをゴミとしてリサイクルできるかどうかを決定します。

参照カウント方法は非常に効率的ですが、2つのオブジェクトが相互に参照している場合、2つのオブジェクトがリサイクルされることはなく、致命的な欠陥です。したがって、JVMはこのマーキングアルゴリズムを使用しません。

2.到達可能性分析アルゴリズム

到達可能性分析アルゴリズムは、オブジェクトからルートオブジェクトへの参照チェーンが到達可能かどうかに基づいて、オブジェクトをリサイクルできるかどうかを判断します。

実行中のプログラムは、すべての参照関係チェーンをグラフとして扱い、GC-Rootsルートオブジェクトオブジェクトコレクションを開始点として使用し、ルートオブジェクトコレクションによって接続されたオブジェクトが到達可能かどうかまで、各ルートノードから継続的に検索します。パスは参照チェーン(Reference-Chain)と呼ばれます。オブジェクトからGC-Rootsへの参照チェーンがない場合は、オブジェクトが使用できないことを意味します。

  • 仮想マシンスタックで参照されるオブジェクト。
  • メタスペースのクラス静的プロパティによって参照されるオブジェクト。
  • メタスペースの定数によって参照されるオブジェクト。
  • ネイティブメソッドスタック内のネイティブメソッドによって参照されるオブジェクト。

参照カウントアルゴリズムと比較して、到達可能性分析アルゴリズムは循環参照によって引き起こされる問題を回避します。また、効率的な実行の特性を持ち、JVMで採用されているマーキングアルゴリズムでもあります。

3、ガベージコレクションメカニズム

1.マーク除去アルゴリズム

マーククリアアルゴリズムは、マークとクリアの2つの段階に分かれています。

マーキングフェーズ:ルートオブジェクトコレクションからスキャンして、残っているオブジェクトをマークします。クリーニングフェーズ:再度スキャンして、マークされていないオブジェクトを見つけてリサイクルします。

このアルゴリズムは効率的ではありません。ガベージコレクションではアプリケーションを一時停止する必要があり、大量のメモリフラグメンテーションが生成されます。後続のプログラム操作中に大きなメモリ占有オブジェクトが割り当てられると、連続メモリが不足するため、簡単に実行できます。別のガベージコレクションアクションをトリガーします。

2.マーキングとソートのアルゴリズム

マークソートアルゴリズムのマーキングプロセスは、マーククリアアルゴリズムに似ています。第1段階:ガベージオブジェクトにマークを付ける、第2段階:すべての残りのオブジェクトをメモリ領域の一方の端に移動する、第3段階:外部のメモリを直接クリーンアップするディスクの最適化の過程で同様の境界端。

ガベージコレクションアルゴリズムは効率的ではありません。オブジェクトの移動プロセス中にアプリケーションを一時停止する必要があります。これは、オブジェクトの生存率が高い(老齢)シーンに適しています。

3.コピーアルゴリズム

コピーアルゴリズムは、メモリを容量に応じて同じサイズの2つの部分に分割し、毎回1つだけを使用します。使用済みのメモリが使い果たされると、残っているオブジェクトが別の空きメモリにコピーされてから使用されます。メモリスペースすぐにクリーンアップされます。

このアルゴリズムは実装が簡単で操作効率が高いですが、メモリスペースが大幅に浪費されるため、新世代など、オブジェクトの生存率が低いシナリオに適しています。

4.世代別収集アルゴリズム

現在、市場に出回っているほとんどすべての仮想マシンがこのリサイクルアルゴリズムを使用しています。世代別収集アルゴリズムは、若い世代と古い世代のそれぞれの特性に応じて異なるアルゴリズムメカニズムを使用します。異なるメモリ領域のオブジェクトのライフサイクルも異なるため、ヒープメモリが使用されますさまざまなリサイクル戦略により、ごみ収集の効率を向上させることができます。通常、新世代のオブジェクトは生存率が低く、リサイクルが頻繁であるため、複製アルゴリズムが使用されます。旧世代はライフサイクルが長く、生存率が高く、マーク除去アルゴリズムまたはマークソートアルゴリズムが使用されます。

次の図に示すように、Javaヒープメモリは通常、若い、古い、永続的な3つのモジュールに分割できます。

新生代

通常の状況では、新しく作成されたオブジェクトインスタンスは最初に新生代の空間に配置されるため、新生代のオブジェクトの高速リサイクルの追求が追求されます。通常の状況では、新生代の記憶は8:1の比率でエデンエリアと2つに分割されます。 :1。サバイバー(survivor0、survivor1)エリア、ほとんどのオブジェクトインスタンスはエデンエリアで生成されます。

ガベージコレクションでは、エデンエリア内の残存オブジェクトがS0エリアにコピーされた後、エデンエリアがクリアされます。S0エリアも満杯になると、エデンエリアとS0エリア内の残存オブジェクトがS1にコピーされます。エリア、エデンエリア、S0エリアをクリアした後、S0を交換エリアとS1エリアの役割S1エリアがエデンエリアとS0エリアに生き残ったオブジェクトを保存できない場合、生き残ったオブジェクトを直接保存し、古い世代のエリアに移動しました。古い世代のエリアもいっぱいになると、FullGCがトリガーされます。つまり、新しい世代です。古い世代はすべてリサイクルされます。

老齢

古い世代の領域には、ライフサイクルの長いオブジェクトがいくつか格納されます。若い世代の多くのガベージコレクションの後でまだ生きているオブジェクトインスタンスは、古い世代の領域に移動されます。

第四に、ソースコードアドレス

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

推奨読書:プログラミングシステムの仕上げ

シリアルナンバー プロジェクト名 GitHubアドレス GitEEアドレス 推奨
01 Javaは、デザインパターン、アルゴリズム、およびデータ構造を記述します GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
02 Javaの基礎、並行性、オブジェクト指向、Web開発 GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆
03 SpringCloudマイクロサービスの基本コンポーネントケースの詳細な説明 GitHub・ここをクリック GitEE・ここをクリック ☆☆☆
04 SpringCloudマイクロサービスアーキテクチャの実際の戦闘の包括的なケース GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
05 SpringBootフレームワークの基本的なアプリケーションから高度なものまで GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆
06 SpringBootフレームワークは、一般的なミドルウェアを統合および開発します GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
07 データ管理、配布、アーキテクチャ設計の基本的なケース GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
08 ビッグデータシリーズ、ストレージ、コンポーネント、コンピューティング、その他のフレームワーク GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆

おすすめ

転載: blog.csdn.net/cicada_smile/article/details/108792556