私の知る限り、Jconsoleまたはその他のツールはSystem.gc()のみを使用します。他に選択肢はありません。誰もが知っているように、JavaはSystem.gc()に依存しないようにすべての人に指示しますが、それはそれがまったく機能しないという意味ではありません。
だからあなたの質問に来ると、どうしてそのボタンを押すとGCが直接呼び出されるのか心配しているようですが、JavaはSystem.gcがGCを呼び出すことを「提案」しているだけだと言っています。つまり、そのボタンはSystem.gc()も呼び出し、JavaがGCを試行することを「提案」するだけであり、Javaがその時点でGCを実行することを決定することがあります(保証されていませんが、Javaが実行します)。
したがって、この事実を証明するために、オブジェクトのロードを作成するだけの単純なプログラムを作成しました。「System.gc()」の行にコメントがあります。ここで、最初にコメント付きのSystem.gc()を使用して、次にSystem.gc()のコメントを解除して、この同じプログラムを実行してみてください。VM引数を-verbose:gc -XX:+ PrintGCTimeStamps -XX:+PrintGCDetailsとして指定してください。
package ravi.tutorial.java.gc;
/**
* Just to test GC. RUn with below VM arguments.
*
* -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
*
*
* @author ravi.k
*
*/
public class TestGC {
public static A a;
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 100; i++) {
populateObjects();
System.out.println("population done for batch: " + i);
}
}
public static void populateObjects() {
for (int i = 0; i < 100000; i++) {
a = new A("A");
}
//System.gc();
}
}
class A {
String s;
public A(String s) {
this.s = s;
}
}
ここで部分的な出力が私のマシンから出ています。
Commened System.gc():ここでGCはjreの意志で呼び出されます。
population done for batch: 0
population done for batch: 1
population done for batch: 2
population done for batch: 3
population done for batch: 4
population done for batch: 5
population done for batch: 6
population done for batch: 7
population done for batch: 8
population done for batch: 9
0.332: [GC 0.332: [ParNew: 17024K->410K(19136K), 0.0024479 secs] 17024K->410K(83008K), 0.0025219 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
population done for batch: 10
population done for batch: 11
population done for batch: 12
population done for batch: 13
population done for batch: 14
population done for batch: 15
population done for batch: 16
population done for batch: 17
population done for batch: 18
population done for batch: 19
0.344: [GC 0.344: [ParNew: 17434K->592K(19136K), 0.0011238 secs] 17434K->592K(83008K), 0.0011645 secs] [Times: user=0.00 sys=0.01, real=0.00 secs]
population done for batch: 20
population done for batch: 21
population done for batch: 22
population done for batch: 23
population done for batch: 24
population done for batch: 25
population done for batch: 26
population done for batch: 27
population done for batch: 28
population done for batch: 29
population done for batch: 30
0.353: [GC 0.353: [ParNew: 17616K->543K(19136K), 0.0011398 secs] 17616K->543K(83008K), 0.0011770 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
population done for batch: 31
population done for batch: 32
population done for batch: 33
コメントなしのSystem.gc():ここでは、バッチごとにGCが呼び出されます。現在、System.gc()はGCを提案しているだけですが、Javaはその時点でGCを実行することを選択しています。これは、他のツールの魔法のGCボタンの場合とまったく同じです:)
0.337: [Full GC (System) 0.337: [CMS: 0K->400K(63872K), 0.0219250 secs] 3296K->400K(83008K), [CMS Perm : 4423K->4422K(21248K)], 0.0220152 secs] [Times: user=0.04 sys=0.00, real=0.02 secs]
population done for batch: 0
0.364: [Full GC (System) 0.364: [CMS: 400K->394K(63872K), 0.0161792 secs] 2492K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0162336 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
population done for batch: 1
0.382: [Full GC (System) 0.382: [CMS: 394K->394K(63872K), 0.0160193 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0160834 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
population done for batch: 2
0.399: [Full GC (System) 0.399: [CMS: 394K->394K(63872K), 0.0160866 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0161489 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
population done for batch: 3
0.417: [Full GC (System) 0.417: [CMS: 394K->394K(63872K), 0.0156326 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0156924 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
population done for batch: 4
0.434: [Full GC (System) 0.434: [CMS: 394K->394K(63872K), 0.0157274 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0157897 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
population done for batch: 5
さらに追加するには、スレッドと同じです。スレッドがいつ実行されるかは保証されませんが、サンプルスレッドプログラムを作成するときはいつでも、スレッドはその時間自体を実行します。したがって、スレッドが開始されるとすぐにJavaが実行された理由を非難するべきではありません:)。Javaはこれらのものに依存しないと言っているだけですが、それらは機能します。また、場合によっては機能しますが、毎回機能するわけではありません。それらのjconsoleツールでさえGCの実行に失敗する可能性がありますが、それは私たちが見たことがないということだけです。