読者です 読者をやめる 読者になる 読者になる

Javaのガーベジコレクションを実行して遊んでみた

Java 百聞不如一見

こんにちは。最近はJavaの猛勉強をしております。
Javaでは明示的にgcを呼び出せるようなので、実際にやってみました。

class TestGarbageCollection {
    public static void main(String[] args) {
        // 現在のRuntimeオブジェクトを取得
        Runtime rt = Runtime.getRuntime();
        // 一端gcを走らせる
        rt.gc();
        // システムメモリ内の空きバイト数の見積もりを返す
        System.out.println(rt.freeMemory());
        // オブジェクトを作る
        Integer i = new Integer(0);
        // システムメモリ内の空きバイト数の見積もりを返す
        System.out.println(rt.freeMemory());
        // 参照を破棄してgcを走らせる
        i = null;
        rt.gc();
        // システムメモリ内の空きバイト数の見積もりを返す
        System.out.println(rt.freeMemory());
    }
}

Javaガーベジコレクションを明示的に動作するようにするにはRuntimeクラスのgcメソッドを呼びます。
ただし、このメソッドは使用されていないオブジェクトのメモリを再利用出来るように、オブジェクトの回収を行う努力をすることを、仮想マシンに要求するだけ、みたいです。
というわけで、実行してみたらこんな感じになりました。

$ java TestGarbageCollection
524833888
523056416
524833752

最初と最後で食い違いがあるのはしょうがないとしても、Integerオブジェクト1個だけで1.8MBもメモリが回収されているんですけど(汗)
まさかIntegerオブジェクトが1.8MBも消費するなんてことはないですよね?