3

私が知っているように、 System.gc() メソッドを使用してガベージ コレクションを実行すると、ヒープから未使用および破棄されていないオブジェクトがすべて収集され、クリーンアップされます。したがって、 System.gc(); を実行すると JVM のメモリを増やす必要があります。しかし、以下のコードを実行すると、結果が混乱します。

Runtime rs = Runtime.getRuntime();
System.out.println("Free memory in JVM before Garbage Collection = " + 
                   rs.freeMemory());
rs.gc();
System.out.println("Free memory in JVM after Garbage Collection = " +
                   rs.freeMemory());

出力は

Free memory in JVM before Garbage Collection = 12184624
Free memory in JVM after Garbage Collection = 12184360    

前の値が後の値よりも大きいことを確認してください。

私が間違った概念を持っている場合は修正するか、なぜこれが起こるのか説明してください。

ありがとうございました。

4

5 に答える 5

6

Java でガベージ コレクションを呼び出すことは、JVM への単なる提案です。ガベージが収集される方法は、技術的には 100% 制御できません。System.gc() を呼び出すと、ゴミを出すように丁寧に提案されますが、Java は反抗的な子供のようにあなたを完全に無視する権利を持っています。

通常は要求どおりに機能しますが、常にそうなるとは限らず、信頼することはできません。

于 2013-08-08T04:17:47.513 に答える
1

System.gc() リクエストに加えて、システムが適切と判断した場合、ガベージ コレクションが自動的に行われます。リクエスト時に解放できるメモリがあるという保証はありません。

于 2013-08-08T04:21:36.740 に答える
0

Java プログラマーとして、Java でガベージ コレクションを強制することはできません。System.gc() を呼び出すことにより、JVM が Java ヒープ サイズに基づくガベージ コレクションが必要であると判断した場合にのみトリガーされます。ガベージ コレクションのリクエストを JVM に送信するために使用される System.gc() や Runtime.gc() などのメソッドがあり、内部でマーク アンド スイープ アルゴリズムを使用して、使用されなくなって収集する必要があるオブジェクトを判断します。ただし、ガベージ コレクションが System.gc() または Runtime.gc() を呼び出したときに発生するとは限りません。さらに、System.gc() または Runtime.gc() を呼び出した時点でガベージ コレクションの対象となるオブジェクトがあるかどうかにも依存します。そうでない場合は、System.gc() または Runtime.gc を呼び出しても効果はありません。 () その瞬間に。

出典:(詳しくはこちら)

http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

于 2013-08-08T04:37:43.483 に答える
0

Javadoc から、

public void gc()

ガベージ コレクタを実行します。このメソッドを呼び出すことは、Java 仮想マシンが未使用のオブジェクトをリサイクルして、現在占有しているメモリをすばやく再利用できるようにすることを示唆しています。メソッド呼び出しから制御が戻ると、仮想マシンは破棄されたすべてのオブジェクトをリサイクルするために最善を尽くしています。名前 gc は「ガベージ コレクター」の略です。仮想マシンは、gcメソッドが明示的に呼び出されていない場合でも、必要に応じて別のスレッドでこのリサイクル プロセスを自動的に実行します。

メソッドSystem.gc()は、このメソッドを呼び出す従来の便利な手段です。

あなたがそれを呼び出してもきれいにgcならないと言いますが、それはJVMのキューに追加され、必要に応じてJVMはそれを行います。そうでなければ無視されます。

于 2013-08-08T04:24:58.710 に答える