System.gc() による明示的な GC を無効にする方法

-XX:+DisableExplicitGC フラグを指定すると System.gc() の呼び出しを無視して、明示的な GC を無効にできるみたいです。

ちょっと試してみる。

class Sample {
  public static void main(String[] args) {
    System.gc();
  }
}


■ 指定なしの GC ログ
( java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps Sample )

Java HotSpot(TM) Client VM (25.45-b02) for windows-x86 JRE (1.8.0_45-b14), built on Apr 10 2015 10:46:40 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 12564936k(7728436k free), swap 25128036k(19442772k free)
CommandLine flags: -XX:InitialHeapSize=16777216 -XX:MaxHeapSize=268435456 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:-UseLargePagesIndividualAllocation 
0.074: [Full GC (System.gc())  712K->413K(15872K), 0.0013140 secs]


■ 指定ありの GC ログ
( java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+DisableExplicitGC Sample )

Java HotSpot(TM) Client VM (25.45-b02) for windows-x86 JRE (1.8.0_45-b14), built on Apr 10 2015 10:46:40 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 12564936k(7729168k free), swap 25128036k(19443444k free)
CommandLine flags: -XX:+DisableExplicitGC -XX:InitialHeapSize=16777216 -XX:MaxHeapSize=268435456 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:-UseLargePagesIndividualAllocation 


ドキュメント的には、以下あたりに情報があります。そもそも System.gc() による明示的な GC はお勧めされてないですね ( JVM 側の自動実行に任せんかいと )。

・その他の考慮事項
http://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/considerations.html

以下あたりにもちょろちょろと情報が。

・Frequently Asked Questions About the Java HotSpot VM
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_pooling

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
- Explicit Garbage Collection
http://www.oracle.com/technetwork/jp/java/javase/gc-tuning-6-140523.html

しかし、本論とは関係ないけど、以下の内容は知らんかった・・・

明示的なガベージ・コレクションが最もよく使用される例の1つが、リモート・メソッド呼出し(RMI)の分散ガベージ・コレクション(DGC)です。RMIを使用するアプリケーションは、他の仮想マシンのオブジェクトを参照します。これらの分散アプリケーションでは、ローカル・ヒープのガベージ・コレクションを時々呼び出さないとガベージを収集できないので、RMIがフル・コレクションを定期的に実行します。

以上です。

[ 検証環境 ]
Windows 7 SP1
Java SE 8 Update 45