Mon, 27 May 2013 15:22:59 +0200
8015268: NPG: 2.5% regression in young GC times on CRM Sales Opty
Summary: Split SystemDictionary and ClassLoaderDataGraph root processing to help load balancing.
Reviewed-by: tschatzl, johnc
1.1 --- a/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp Fri May 24 14:16:41 2013 +0200 1.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp Mon May 27 15:22:59 2013 +0200 1.3 @@ -120,6 +120,9 @@ 1.4 1.5 case system_dictionary: 1.6 SystemDictionary::always_strong_oops_do(&mark_and_push_closure); 1.7 + break; 1.8 + 1.9 + case class_loader_data: 1.10 ClassLoaderDataGraph::always_strong_oops_do(&mark_and_push_closure, &follow_klass_closure, true); 1.11 break; 1.12
2.1 --- a/src/share/vm/gc_implementation/parallelScavenge/pcTasks.hpp Fri May 24 14:16:41 2013 +0200 2.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/pcTasks.hpp Mon May 27 15:22:59 2013 +0200 2.3 @@ -98,7 +98,8 @@ 2.4 management = 6, 2.5 jvmti = 7, 2.6 system_dictionary = 8, 2.7 - code_cache = 9 2.8 + class_loader_data = 9, 2.9 + code_cache = 10 2.10 }; 2.11 private: 2.12 RootType _root_type;
3.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Fri May 24 14:16:41 2013 +0200 3.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Mon May 27 15:22:59 2013 +0200 3.3 @@ -2338,6 +2338,7 @@ 3.4 q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::flat_profiler)); 3.5 q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::management)); 3.6 q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::system_dictionary)); 3.7 + q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::class_loader_data)); 3.8 q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jvmti)); 3.9 q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::code_cache)); 3.10
4.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Fri May 24 14:16:41 2013 +0200 4.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Mon May 27 15:22:59 2013 +0200 4.3 @@ -408,6 +408,7 @@ 4.4 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler)); 4.5 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management)); 4.6 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::system_dictionary)); 4.7 + q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data)); 4.8 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti)); 4.9 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache)); 4.10
5.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp Fri May 24 14:16:41 2013 +0200 5.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp Mon May 27 15:22:59 2013 +0200 5.3 @@ -79,14 +79,15 @@ 5.4 break; 5.5 5.6 case system_dictionary: 5.7 - { 5.8 SystemDictionary::oops_do(&roots_closure); 5.9 + break; 5.10 5.11 - // Move this to another root_type? 5.12 - PSScavengeKlassClosure klass_closure(pm); 5.13 - ClassLoaderDataGraph::oops_do(&roots_closure, &klass_closure, false); 5.14 - } 5.15 - break; 5.16 + case class_loader_data: 5.17 + { 5.18 + PSScavengeKlassClosure klass_closure(pm); 5.19 + ClassLoaderDataGraph::oops_do(&roots_closure, &klass_closure, false); 5.20 + } 5.21 + break; 5.22 5.23 case management: 5.24 Management::oops_do(&roots_closure);
6.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psTasks.hpp Fri May 24 14:16:41 2013 +0200 6.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psTasks.hpp Mon May 27 15:22:59 2013 +0200 6.3 @@ -59,9 +59,10 @@ 6.4 object_synchronizer = 4, 6.5 flat_profiler = 5, 6.6 system_dictionary = 6, 6.7 - management = 7, 6.8 - jvmti = 8, 6.9 - code_cache = 9 6.10 + class_loader_data = 7, 6.11 + management = 8, 6.12 + jvmti = 9, 6.13 + code_cache = 10 6.14 }; 6.15 private: 6.16 RootType _root_type;
7.1 --- a/src/share/vm/memory/sharedHeap.cpp Fri May 24 14:16:41 2013 +0200 7.2 +++ b/src/share/vm/memory/sharedHeap.cpp Mon May 27 15:22:59 2013 +0200 7.3 @@ -45,6 +45,7 @@ 7.4 SH_PS_FlatProfiler_oops_do, 7.5 SH_PS_Management_oops_do, 7.6 SH_PS_SystemDictionary_oops_do, 7.7 + SH_PS_ClassLoaderDataGraph_oops_do, 7.8 SH_PS_jvmti_oops_do, 7.9 SH_PS_StringTable_oops_do, 7.10 SH_PS_CodeCache_oops_do, 7.11 @@ -173,12 +174,18 @@ 7.12 if (!_process_strong_tasks->is_task_claimed(SH_PS_SystemDictionary_oops_do)) { 7.13 if (so & SO_AllClasses) { 7.14 SystemDictionary::oops_do(roots); 7.15 + } else if (so & SO_SystemClasses) { 7.16 + SystemDictionary::always_strong_oops_do(roots); 7.17 + } else { 7.18 + fatal("We should always have selected either SO_AllClasses or SO_SystemClasses"); 7.19 + } 7.20 + } 7.21 + 7.22 + if (!_process_strong_tasks->is_task_claimed(SH_PS_ClassLoaderDataGraph_oops_do)) { 7.23 + if (so & SO_AllClasses) { 7.24 ClassLoaderDataGraph::oops_do(roots, klass_closure, !is_scavenging); 7.25 } else if (so & SO_SystemClasses) { 7.26 - SystemDictionary::always_strong_oops_do(roots); 7.27 ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, !is_scavenging); 7.28 - } else { 7.29 - fatal("We should always have selected either SO_AllClasses or SO_SystemClasses"); 7.30 } 7.31 } 7.32