Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでガベージコレクター(GC)を手動で呼び出す2つの方法とは?

Javaにおけるガベージコレクションは、Garbage Collector(GC)と呼ばれるデーモンスレッドによって実行されます。通常、JVMが自動的に適切なタイミングでGCを実行しますが、開発者側からJVMに対して「GCを実行してほしい」と要求することも可能です。ただし、この要求が必ずしも受け入れられる保証はない点に注意が必要です。

Javaでガベージコレクターを手動で呼び出す方法は、主に以下の2つがあります。

  • Systemクラスを利用する方法
  • Runtimeクラスを利用する方法

1. Systemクラスを使う方法

Systemクラスには静的メソッドgc()が用意されており、これを呼び出すことでJVMにガベージコレクターの実行を要求できます。最もシンプルで一般的な方法です。

コード例

public class SystemClassTest {
    public static void main(String[] args) {
        SystemClassTest test = new SystemClassTest();
        test = null; // 参照を切ってオブジェクトをGC対象にする
        System.gc();
    }
    public void finalize() {
        System.out.println("Garbage collected");
    }
}

実行結果

Garbage collected

2. Runtimeクラスを使う方法

RuntimeクラスはJavaにおけるシングルトンクラスであり、getRuntime()メソッドを使って唯一のインスタンスを取得します。gc()メソッドはRuntimeクラスのインスタンスメソッドである点が、Systemクラスとの大きな違いです。

コード例

public class RuntimeClassTest {
    public static void main(String[] args) {
        RuntimeClassTest test = new RuntimeClassTest();
        test = null; // 参照を切ってオブジェクトをGC対象にする
        Runtime.getRuntime().gc();
    }
    public void finalize() {
        System.out.println("Garbage collected");
    }
}

実行結果

Garbage collected

補足:実務上の注意点

上記の例では動作確認のためfinalize()メソッドを使用していますが、このメソッドはJava 9以降で非推奨(deprecated)となっています。finalize()の実行タイミングはJVMに依存するため予測が困難であり、リソース解放にはtry-with-resourcesやAutoCloseableインターフェースの利用が推奨されます。

また、System.gc()は内部的にRuntime.getRuntime().gc()を呼び出しているだけです。どちらの方法でもGCの実行はあくまで「要求」であり、JVMが即座にGCを実行するとは限らないため、パフォーマンスチューニングの目的での頻繁な呼び出しは避けるべきです。

  1. Javaでメソッドのオーバーライドを防ぐ3つの方法を徹底解説

    Javaにおけるメソッドのオーバーライドは、実行時に行われるメソッドの動的バインディング(ダイナミックバインディング)によって実現されています。つまり、特定のメソッドに対してコンパイラに静的バインディング(スタティックバインディング)を強制させることができれば、そのメソッドが派生クラスでオーバーライドされるのを防ぐことが可能です。Javaでメソッドのオーバーライドを防ぐ方法は、主に以下の3つがあります。基底クラスのメソッドを final にする基底クラスのメソッドを static にする基底クラスのメソッドを private にする1. finalメソッドはオーバーライドできないメソッドに f

  2. Javaでサブパッケージを使う方法とは?コンパイルからインポートまで徹底解説

    Javaのサブパッケージとは Javaにおけるサブパッケージは、ファイルシステム上のサブディレクトリとよく似た仕組みです。パッケージを階層的に整理することで、多数のクラスやインターフェースを効率よく管理できるようになります。 例として、com.apple.computers というパッケージに Dell.java というソースファイルが含まれている場合、そのファイルは次のような一連のサブディレクトリの中に配置されます。 ....\com\apple\computers\Dell.java コンパイル時の出力ファイルの仕組み コンパイルを実行すると、コンパイラはソースファイル内で定義されているク