メモリ確保以外の処理パスで発生する GC 処理 (java.lang.System.gc() 等)では, 最終的に CollectedHeap::collect() が呼び出される.
GenCollectedHeap は CollectedHeap::collect() をオーバーライドしているので, 実際に呼び出されるのは GenCollectedHeap::collect() になる. なお, GenCollectedHeap::collect() 内では CMS か否かに応じて処理が分岐しており, 実際に行われる処理は 2通り存在する (See: here and here for details)
GenCollectedHeap::collect(GCCause::Cause cause) -> * アルゴリズムが CMS で, かつ特定のオプション(※)がセットされている場合: -> GenCollectedHeap::collect_mostly_concurrent() -> (See: here for details) * それ以外の場合: -> GenCollectedHeap::collect(GCCause::Cause cause, int max_level) -> (See: here for details)
(※) java.lang.System.gc() が原因の場合は ExplicitGCInvokesConcurrent オプション, JNI の ReleasePrimitiveArrayCritical() 及び ReleaseStringCritical() が原因の場合は GCLockerInvokesConcurrent オプションがセットされているとこちらになる. それ以外の原因の場合にこちらになることはない (See: GenCollectedHeap::should_do_concurrent_full_gc()).
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.