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がフル・コレクションを定期的に実行します。
以上です。