提交 25bb3646 编写于 作者: S stefank

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
上级 05f3f566
...@@ -120,6 +120,9 @@ void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) { ...@@ -120,6 +120,9 @@ void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
case system_dictionary: case system_dictionary:
SystemDictionary::always_strong_oops_do(&mark_and_push_closure); SystemDictionary::always_strong_oops_do(&mark_and_push_closure);
break;
case class_loader_data:
ClassLoaderDataGraph::always_strong_oops_do(&mark_and_push_closure, &follow_klass_closure, true); ClassLoaderDataGraph::always_strong_oops_do(&mark_and_push_closure, &follow_klass_closure, true);
break; break;
......
...@@ -98,7 +98,8 @@ class MarkFromRootsTask : public GCTask { ...@@ -98,7 +98,8 @@ class MarkFromRootsTask : public GCTask {
management = 6, management = 6,
jvmti = 7, jvmti = 7,
system_dictionary = 8, system_dictionary = 8,
code_cache = 9 class_loader_data = 9,
code_cache = 10
}; };
private: private:
RootType _root_type; RootType _root_type;
......
...@@ -2338,6 +2338,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm, ...@@ -2338,6 +2338,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::flat_profiler)); q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::flat_profiler));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::management)); q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::management));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::system_dictionary)); q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::system_dictionary));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::class_loader_data));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jvmti)); q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jvmti));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::code_cache)); q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::code_cache));
......
...@@ -408,6 +408,7 @@ bool PSScavenge::invoke_no_policy() { ...@@ -408,6 +408,7 @@ bool PSScavenge::invoke_no_policy() {
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler)); q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management)); q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::system_dictionary)); q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::system_dictionary));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti)); q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache)); q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
......
...@@ -79,15 +79,16 @@ void ScavengeRootsTask::do_it(GCTaskManager* manager, uint which) { ...@@ -79,15 +79,16 @@ void ScavengeRootsTask::do_it(GCTaskManager* manager, uint which) {
break; break;
case system_dictionary: case system_dictionary:
{
SystemDictionary::oops_do(&roots_closure); SystemDictionary::oops_do(&roots_closure);
// Move this to another root_type?
PSScavengeKlassClosure klass_closure(pm);
ClassLoaderDataGraph::oops_do(&roots_closure, &klass_closure, false);
}
break; break;
case class_loader_data:
{
PSScavengeKlassClosure klass_closure(pm);
ClassLoaderDataGraph::oops_do(&roots_closure, &klass_closure, false);
}
break;
case management: case management:
Management::oops_do(&roots_closure); Management::oops_do(&roots_closure);
break; break;
......
...@@ -59,9 +59,10 @@ class ScavengeRootsTask : public GCTask { ...@@ -59,9 +59,10 @@ class ScavengeRootsTask : public GCTask {
object_synchronizer = 4, object_synchronizer = 4,
flat_profiler = 5, flat_profiler = 5,
system_dictionary = 6, system_dictionary = 6,
management = 7, class_loader_data = 7,
jvmti = 8, management = 8,
code_cache = 9 jvmti = 9,
code_cache = 10
}; };
private: private:
RootType _root_type; RootType _root_type;
......
...@@ -45,6 +45,7 @@ enum SH_process_strong_roots_tasks { ...@@ -45,6 +45,7 @@ enum SH_process_strong_roots_tasks {
SH_PS_FlatProfiler_oops_do, SH_PS_FlatProfiler_oops_do,
SH_PS_Management_oops_do, SH_PS_Management_oops_do,
SH_PS_SystemDictionary_oops_do, SH_PS_SystemDictionary_oops_do,
SH_PS_ClassLoaderDataGraph_oops_do,
SH_PS_jvmti_oops_do, SH_PS_jvmti_oops_do,
SH_PS_StringTable_oops_do, SH_PS_StringTable_oops_do,
SH_PS_CodeCache_oops_do, SH_PS_CodeCache_oops_do,
...@@ -173,15 +174,21 @@ void SharedHeap::process_strong_roots(bool activate_scope, ...@@ -173,15 +174,21 @@ void SharedHeap::process_strong_roots(bool activate_scope,
if (!_process_strong_tasks->is_task_claimed(SH_PS_SystemDictionary_oops_do)) { if (!_process_strong_tasks->is_task_claimed(SH_PS_SystemDictionary_oops_do)) {
if (so & SO_AllClasses) { if (so & SO_AllClasses) {
SystemDictionary::oops_do(roots); SystemDictionary::oops_do(roots);
ClassLoaderDataGraph::oops_do(roots, klass_closure, !is_scavenging);
} else if (so & SO_SystemClasses) { } else if (so & SO_SystemClasses) {
SystemDictionary::always_strong_oops_do(roots); SystemDictionary::always_strong_oops_do(roots);
ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, !is_scavenging);
} else { } else {
fatal("We should always have selected either SO_AllClasses or SO_SystemClasses"); fatal("We should always have selected either SO_AllClasses or SO_SystemClasses");
} }
} }
if (!_process_strong_tasks->is_task_claimed(SH_PS_ClassLoaderDataGraph_oops_do)) {
if (so & SO_AllClasses) {
ClassLoaderDataGraph::oops_do(roots, klass_closure, !is_scavenging);
} else if (so & SO_SystemClasses) {
ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, !is_scavenging);
}
}
if (!_process_strong_tasks->is_task_claimed(SH_PS_StringTable_oops_do)) { if (!_process_strong_tasks->is_task_claimed(SH_PS_StringTable_oops_do)) {
if (so & SO_Strings) { if (so & SO_Strings) {
StringTable::oops_do(roots); StringTable::oops_do(roots);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册