8227060: Optimize safepoint cleanup subtask order

Reviewed-by: kbarrett, pchilanomate
This commit is contained in:
Coleen Phillimore 2022-07-19 16:32:07 +00:00
parent 2cb659e7f4
commit 96a542feb2
5 changed files with 26 additions and 40 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -252,7 +252,6 @@ public:
static bool can_be_osr_compiled(const methodHandle& m, int comp_level = CompLevel_any); static bool can_be_osr_compiled(const methodHandle& m, int comp_level = CompLevel_any);
static bool is_compilation_enabled(); static bool is_compilation_enabled();
static void do_safepoint_work() { }
static CompileTask* select_task_helper(CompileQueue* compile_queue); static CompileTask* select_task_helper(CompileQueue* compile_queue);
// Return initial compile level to use with Xcomp (depends on compilation mode). // Return initial compile level to use with Xcomp (depends on compilation mode).
static void reprofile(ScopeDesc* trap_scope, bool is_osr); static void reprofile(ScopeDesc* trap_scope, bool is_osr);

View file

@ -516,19 +516,9 @@ bool SafepointSynchronize::is_cleanup_needed() {
return false; return false;
} }
class ParallelSPCleanupThreadClosure : public ThreadClosure { class ParallelCleanupTask : public WorkerTask {
public:
void do_thread(Thread* thread) {
if (thread->is_Java_thread()) {
StackWatermarkSet::start_processing(JavaThread::cast(thread), StackWatermarkKind::gc);
}
}
};
class ParallelSPCleanupTask : public WorkerTask {
private: private:
SubTasksDone _subtasks; SubTasksDone _subtasks;
uint _num_workers;
bool _do_lazy_roots; bool _do_lazy_roots;
class Tracer { class Tracer {
@ -548,32 +538,14 @@ private:
}; };
public: public:
ParallelSPCleanupTask(uint num_workers) : ParallelCleanupTask() :
WorkerTask("Parallel Safepoint Cleanup"), WorkerTask("Parallel Safepoint Cleanup"),
_subtasks(SafepointSynchronize::SAFEPOINT_CLEANUP_NUM_TASKS), _subtasks(SafepointSynchronize::SAFEPOINT_CLEANUP_NUM_TASKS),
_num_workers(num_workers),
_do_lazy_roots(!VMThread::vm_operation()->skip_thread_oop_barriers() && _do_lazy_roots(!VMThread::vm_operation()->skip_thread_oop_barriers() &&
Universe::heap()->uses_stack_watermark_barrier()) {} Universe::heap()->uses_stack_watermark_barrier()) {}
void work(uint worker_id) { void work(uint worker_id) {
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_LAZY_ROOT_PROCESSING)) { // These tasks are ordered by relative length of time to execute so that potentially longer tasks start first.
if (_do_lazy_roots) {
Tracer t("lazy partial thread root processing");
ParallelSPCleanupThreadClosure cl;
Threads::threads_do(&cl);
}
}
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_UPDATE_INLINE_CACHES)) {
Tracer t("updating inline caches");
InlineCacheBuffer::update_inline_caches();
}
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_COMPILATION_POLICY)) {
Tracer t("compilation policy safepoint handler");
CompilationPolicy::do_safepoint_work();
}
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_SYMBOL_TABLE_REHASH)) { if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_SYMBOL_TABLE_REHASH)) {
if (SymbolTable::needs_rehashing()) { if (SymbolTable::needs_rehashing()) {
Tracer t("rehashing symbol table"); Tracer t("rehashing symbol table");
@ -595,6 +567,25 @@ public:
} }
} }
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_LAZY_ROOT_PROCESSING)) {
if (_do_lazy_roots) {
Tracer t("lazy partial thread root processing");
class LazyRootClosure : public ThreadClosure {
public:
void do_thread(Thread* thread) {
StackWatermarkSet::start_processing(JavaThread::cast(thread), StackWatermarkKind::gc);
}
};
LazyRootClosure cl;
Threads::java_threads_do(&cl);
}
}
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_UPDATE_INLINE_CACHES)) {
Tracer t("updating inline caches");
InlineCacheBuffer::update_inline_caches();
}
if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_REQUEST_OOPSTORAGE_CLEANUP)) { if (_subtasks.try_claim_task(SafepointSynchronize::SAFEPOINT_CLEANUP_REQUEST_OOPSTORAGE_CLEANUP)) {
// Don't bother reporting event or time for this very short operation. // Don't bother reporting event or time for this very short operation.
// To have any utility we'd also want to report whether needed. // To have any utility we'd also want to report whether needed.
@ -612,15 +603,13 @@ void SafepointSynchronize::do_cleanup_tasks() {
CollectedHeap* heap = Universe::heap(); CollectedHeap* heap = Universe::heap();
assert(heap != NULL, "heap not initialized yet?"); assert(heap != NULL, "heap not initialized yet?");
ParallelCleanupTask cleanup;
WorkerThreads* cleanup_workers = heap->safepoint_workers(); WorkerThreads* cleanup_workers = heap->safepoint_workers();
if (cleanup_workers != NULL) { if (cleanup_workers != NULL) {
// Parallel cleanup using GC provided thread pool. // Parallel cleanup using GC provided thread pool.
uint num_cleanup_workers = cleanup_workers->active_workers();
ParallelSPCleanupTask cleanup(num_cleanup_workers);
cleanup_workers->run_task(&cleanup); cleanup_workers->run_task(&cleanup);
} else { } else {
// Serial cleanup using VMThread. // Serial cleanup using VMThread.
ParallelSPCleanupTask cleanup(1);
cleanup.work(0); cleanup.work(0);
} }

View file

@ -72,7 +72,6 @@ class SafepointSynchronize : AllStatic {
enum SafepointCleanupTasks { enum SafepointCleanupTasks {
SAFEPOINT_CLEANUP_LAZY_ROOT_PROCESSING, SAFEPOINT_CLEANUP_LAZY_ROOT_PROCESSING,
SAFEPOINT_CLEANUP_UPDATE_INLINE_CACHES, SAFEPOINT_CLEANUP_UPDATE_INLINE_CACHES,
SAFEPOINT_CLEANUP_COMPILATION_POLICY,
SAFEPOINT_CLEANUP_SYMBOL_TABLE_REHASH, SAFEPOINT_CLEANUP_SYMBOL_TABLE_REHASH,
SAFEPOINT_CLEANUP_STRING_TABLE_REHASH, SAFEPOINT_CLEANUP_STRING_TABLE_REHASH,
SAFEPOINT_CLEANUP_SYSTEM_DICTIONARY_RESIZE, SAFEPOINT_CLEANUP_SYSTEM_DICTIONARY_RESIZE,

View file

@ -1671,7 +1671,7 @@ void ObjectSynchronizer::do_final_audit_and_print_stats() {
; // empty ; // empty
} }
// The other audit_and_print_stats() call is done at the Debug // The other audit_and_print_stats() call is done at the Debug
// level at a safepoint in ObjectSynchronizer::do_safepoint_work(). // level at a safepoint in SafepointSynchronize::do_cleanup_tasks.
ObjectSynchronizer::audit_and_print_stats(true /* on_exit */); ObjectSynchronizer::audit_and_print_stats(true /* on_exit */);
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -41,7 +41,6 @@ public class SafepointCleanupTest {
output.shouldContain("[safepoint,cleanup]"); output.shouldContain("[safepoint,cleanup]");
output.shouldContain("safepoint cleanup tasks"); output.shouldContain("safepoint cleanup tasks");
output.shouldContain("updating inline caches"); output.shouldContain("updating inline caches");
output.shouldContain("compilation policy safepoint handler");
output.shouldHaveExitValue(0); output.shouldHaveExitValue(0);
} }