0

以下に記述したコードがどのように機能し、出力されるかを理解しようとしています。

public static void getRunTimeMemoryConsumption(){

List<Integer> array = new ArrayList<Integer>();
for(int i = 0 ; i < 100000 ; i++){
    array.add(i);
}

List<Integer> array1 = new ArrayList<Integer>();
for(int i = 0 ; i < 100 ; i++){
    array1.add(i);
}

Runtime rt = Runtime.getRuntime();

//Run the GC
rt.gc();

long memoryFreed = rt.totalMemory() - rt.freeMemory();
System.out.println("Memory freed in Mbytes :: " + memoryFreed/(1024));

}

このコードを実行すると、常に出力として132 KBが返されます(9/10実行)。ただし、rt.gc()呼び出しを削除すると、出力ステートメントに書き込まれるメモリが解放されます(> 100 MB)。Javaランタイムのこの動作をどのように理解できますか?

4

4 に答える 4

2

あなたが何をしようとしているのか完全にはわかりません。

解放されたメモリの量を計算しているのではなく、計算しているのはrt.totalMemory() - rt.freeMemory()、つまり、使用されているメモリの量です。そのことを念頭に置いて、ガベージコレクションを行わないと、gcの後に多くのメモリが使用されるため、得られる結果は非常に理にかなっています。rt.totalMemory() - rt.freeMemory()解放されたメモリの量を確認するには、ガベージコレクタの呼び出しの前後を比較する必要があります。

また、forループのリストに入力した整数は、ライブオブジェクト(つまりリスト)による参照であるため、ガベージコレクションの対象にはなりません。プログラムの残りの部分が表示されないため、ガベージコレクションが何であるかはわかりませんが、ガベージコレクションの時点で、ライブオブジェクトによる参照ではないオブジェクトが存在するようにテストを変更する必要があります。

于 2013-02-20T09:10:07.537 に答える
2

rt.freeMemory()前後を比較するだけrt.gc()です。式は使用済みメモリを出力します。これが、値が期待値と反対である理由です。

于 2013-02-20T09:13:01.900 に答える
0

ここでのガベージコレクションは、実際には範囲外のオブジェクトがないため、実際には何も削除されません。このメソッドは両方のリストのスコープを設定するため、ガベージコレクションの呼び出し後も両方にアクセスできます。ガベージコレクションは、一般的にJavaでスケジュールされたタスクであるため、理論的にはいつでも実行できます。これは、(ここにあるように)まだスコープ内にあるオブジェクトをガベージコレクションで破棄したくないため、ここでの動作が実際に良好であることを意味します。

于 2013-02-20T09:05:45.707 に答える
0

rt.gc()によって呼び出されるガベージコレクターアクティビティに費やされたため、memoryFreedが少なくなったようです。実際、rt.gc()は、アレイに割り当てられたメモリを解放しません。GCによって解放されたメモリの量を確認する場合は、getRunTimeMemoryConsumption()メソッドの外部でカウントを実行するか、測定前に配列をnullに割り当てる必要があります。

于 2013-02-20T09:13:38.433 に答える