1. 概要

このチュートリアルでは、ガベージコレクタールート(GCルート)とは何かを学習します。 さらに、GCルートのタイプについても説明します。 その後、GCルートとライブオブジェクトの違いを示します。

2. GCルート定義

まず、GCルートとは何かを定義しましょう。 GCルートは、Javaのガベージコレクションのコンテキストで使用される用語です。 これらは、ガベージコレクター用の特別なオブジェクトです。 名前が示すように、GCルートはガベージコレクタープロセスの開始点です。 一般に、GCルートから直接または間接的に参照されるすべてのオブジェクトはガベージコレクションされません。

3. GCルートの種類

GCルートの主なタイプを見てみましょう。

  • クラス:システムクラスローダーによってロードされるクラス。 静的変数への参照も含まれています
  • スタックローカル:ローカルスタックに格納されているメソッドへのローカル変数とパラメーター
  • アクティブなJavaスレッド:すべてのアクティブなJavaスレッド
  • JNIリファレンス:JNI呼び出し用に作成されたネイティブコードJavaオブジェクト。 ローカル変数、JNIメソッドへのパラメーター、およびグローバルJNI参照が含まれています

さらに、GCルートにはさらにいくつかのタイプがあります。

  • 同期のモニターとして使用されるオブジェクト
  • その目的のためにガベージコレクションされない、JVM実装によって定義された特定のオブジェクト。 重要な例外クラス、システムクラスローダー、またはカスタムクラスローダーが含まれている可能性があります

さらに、特定のオブジェクトがGCルートであるというJVMごとのドキュメントはありません。 人気のあるJavaIDEのいくつかは、GCルートの観点からメモリを分析する機能を提供します。 これは、アプリケーションのメモリリークを分析するときに役立ちます。

4. GCルーツvs。 ライブオブジェクト

次に、ガベージコレクションプロセスで定義されたライブオブジェクトを見てみましょう。

アプリケーションによってアクティブに使用されるすべてのオブジェクトは、GCのライブオブジェクトです。 さらに、ガベージコレクターはライブオブジェクトを削除しません。 GCルートは特殊なタイプのライブオブジェクトです。 したがって 定義上、すべてのGCルートはライブオブジェクトです。

5. GCルートのガベージコレクターの使用

次に、ガベージコレクションプロセスでのGCルートの使用法を見てみましょう。

実際のところ、HotSpot JVMのすべてのGC実装は、トレースコレクターです。 GCは、オブジェクトグラフをトラバースすることにより、すべてのライブオブジェクトを識別します。 さらに、訪問されて生存としてマークされたオブジェクトは、ガベージコレクションされません。 グラフをトラバースできるようにするには、開始点が必要です。 したがって、GCルートはトレースコレクターの開始点です。

GCはルートからグラフのトラバースを開始し、グラフ内のすべての訪問済みオブジェクトを生存としてマークします。 プロセスは、アプリケーションで定義されたすべてのGCルートに対して実行されます。 さらに、すべてのGCルートから始まるすべてのグラフを処理します。 次に、訪問したすべてのオブジェクトを生存としてマークします。 その後、アクセスされていないすべてのオブジェクトがガベージコレクションされます。

6. 結論

この短い記事では、GCルートとは何かについて説明しました。 次に、GCルートの種類について説明しました。 次に、GCルートとライブオブジェクトの違いを示しました。 最後に、ガベージコレクションプロセスでのGCルートの使用法について説明しました。