java垃圾回收那点事(一) System.gc开始说起
java提供了从语言角度能够强制jvm进行垃圾回收,在我们的程序中可以通过调用System.gc去强制jvm进行垃圾回收,通过源码我们可以看到实际上是调用了Runtime去强制gc
if (UseParallelGC) {#ifndef SERIALGC Universe::_collectedHeap = new ParallelScavengeHeap();#else // SERIALGC fatal("UseParallelGC not supported in java kernel vm.");#endif // SERIALGC } else if (UseG1GC) {#ifndef SERIALGC G1CollectorPolicy* g1p = new G1CollectorPolicy_BestRegionsFirst(); G1CollectedHeap* g1h = new G1CollectedHeap(g1p); Universe::_collectedHeap = g1h;#else // SERIALGC fatal("UseG1GC not supported in java kernel vm.");#endif // SERIALGC } else { GenCollectorPolicy *gc_policy; if (UseSerialGC) { gc_policy = new MarkSweepPolicy(); } else if (UseConcMarkSweepGC) {#ifndef SERIALGC if (UseAdaptiveSizePolicy) { gc_policy = new ASConcurrentMarkSweepPolicy(); } else { gc_policy = new ConcurrentMarkSweepPolicy(); }#else // SERIALGC fatal("UseConcMarkSweepGC not supported in java kernel vm.");#endif // SERIALGC } else { // default old generation gc_policy = new MarkSweepPolicy(); } Universe::_collectedHeap = new GenCollectedHeap(gc_policy); }从源码中我们可以看到
Parallel GC 是用的是ParallelScavengeHeap,
CMS 使用的是 GenCollectdHeap
G1使用的是G1CollectedHeap