JDK的bug? 关于 新生代启用Parallel Scavenge 和 老生代启用Serial Old 组合
根据这篇文章(https://openjdk.java.net/jeps/366)所说,应该是使用-XX:+UseParallelGC -XX:-UseParallelOldGC
可以启动这个组合。但是当我本地在jdk6、jdk8尝试的时候。打印的结果是
新生代:parallel Scavenge
老生代:Parallel Old 而不是 Serial Old。
如图所示:
如果是Serial Old应该显示(MarkSweepCompact才对吧?)如图所示:
GCInfo的代码如下所示:
public static void printGCCollector() {
List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
System.out.println(gcMxBean.getName());
//System.out.println(gcMxBean.getObjectName()); jdk6没有这个API
}
}
这个主要是参考主要的GC算法,
-XX:+UseParallelGC说明用了PS算法,-XX:+UseSerialGC说明用了Serial GC算法
void MemoryService::set_universe_heap(CollectedHeap* heap) { CollectedHeap::Name kind = heap->kind(); switch (kind) { case CollectedHeap::GenCollectedHeap : { add_gen_collected_heap_info(GenCollectedHeap::heap()); break; } #if INCLUDE_ALL_GCS case CollectedHeap::ParallelScavengeHeap : { add_parallel_scavenge_heap_info(ParallelScavengeHeap::heap()); break; } case CollectedHeap::G1CollectedHeap : { add_g1_heap_info(G1CollectedHeap::heap()); break; } #endif // INCLUDE_ALL_GCS default: { guarantee(false, "Unrecognized kind of heap"); } } ... } void MemoryService::add_gen_collected_heap_info(GenCollectedHeap* heap) { CollectorPolicy* policy = heap->collector_policy(); assert(policy->is_two_generation_policy(), "Only support two generations"); guarantee(heap->n_gens() == 2, "Only support two-generation heap"); TwoGenerationCollectorPolicy* two_gen_policy = policy->as_two_generation_policy(); if (two_gen_policy != NULL) { GenerationSpec** specs = two_gen_policy->generations(); Generation::Name kind = specs[0]->name(); switch (kind) { case Generation::DefNew: _minor_gc_manager = MemoryManager::get_copy_memory_manager(); break; #if INCLUDE_ALL_GCS case Generation::ParNew: case Generation::ASParNew: _minor_gc_manager = MemoryManager::get_parnew_memory_manager(); break; #endif // INCLUDE_ALL_GCS default: guarantee(false, "Unrecognized generation spec"); break; } if (policy->is_mark_sweep_policy()) { _major_gc_manager = MemoryManager::get_msc_memory_manager(); #if INCLUDE_ALL_GCS } else if (policy->is_concurrent_mark_sweep_policy()) { _major_gc_manager = MemoryManager::get_cms_memory_manager(); #endif // INCLUDE_ALL_GCS } else { guarantee(false, "Unknown two-gen policy"); } } else { guarantee(false, "Non two-gen policy"); } _managers_list->append(_minor_gc_manager); _managers_list->append(_major_gc_manager); add_generation_memory_pool(heap->get_gen(minor), _major_gc_manager, _minor_gc_manager); add_generation_memory_pool(heap->get_gen(major), _major_gc_manager); } void MemoryService::add_parallel_scavenge_heap_info(ParallelScavengeHeap* heap) { // Two managers to keep statistics about _minor_gc_manager and _major_gc_manager GC. _minor_gc_manager = MemoryManager::get_psScavenge_memory_manager(); _major_gc_manager = MemoryManager::get_psMarkSweep_memory_manager(); _managers_list->append(_minor_gc_manager); _managers_list->append(_major_gc_manager); add_psYoung_memory_pool(heap->young_gen(), _major_gc_manager, _minor_gc_manager); add_psOld_memory_pool(heap->old_gen(), _major_gc_manager); }