8364176: Serial: Group all class unloading logic at the end of marking phase

Reviewed-by: tschatzl, sangheki
This commit is contained in:
Albert Mingkun Yang 2025-07-31 18:52:44 +00:00
parent fe09e93b8f
commit 443afdc77f
2 changed files with 12 additions and 13 deletions

View File

@ -525,7 +525,9 @@ void SerialFullGC::phase1_mark(bool clear_all_softrefs) {
{
GCTraceTime(Debug, gc, phases) tm_m("Class Unloading", gc_timer());
ClassUnloadingContext* ctx = ClassUnloadingContext::context();
ClassUnloadingContext ctx(1 /* num_nmethod_unlink_workers */,
false /* unregister_nmethods_during_purge */,
false /* lock_nmethod_free_separately */);
bool unloading_occurred;
{
@ -541,7 +543,7 @@ void SerialFullGC::phase1_mark(bool clear_all_softrefs) {
{
GCTraceTime(Debug, gc, phases) t("Purge Unlinked NMethods", gc_timer());
// Release unloaded nmethod's memory.
ctx->purge_nmethods();
ctx.purge_nmethods();
}
{
GCTraceTime(Debug, gc, phases) ur("Unregister NMethods", gc_timer());
@ -549,7 +551,7 @@ void SerialFullGC::phase1_mark(bool clear_all_softrefs) {
}
{
GCTraceTime(Debug, gc, phases) t("Free Code Blobs", gc_timer());
ctx->free_nmethods();
ctx.free_nmethods();
}
// Prune dead klasses from subklass/sibling/implementor lists.
@ -557,6 +559,13 @@ void SerialFullGC::phase1_mark(bool clear_all_softrefs) {
// Clean JVMCI metadata handles.
JVMCI_ONLY(JVMCI::do_unloading(unloading_occurred));
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
ClassLoaderDataGraph::purge(true /* at_safepoint */);
DEBUG_ONLY(MetaspaceUtils::verify();)
// Need to clear claim bits for the next mark.
ClassLoaderDataGraph::clear_claimed_marks();
}
{

View File

@ -603,9 +603,6 @@ void SerialHeap::do_full_collection(bool clear_all_soft_refs) {
gc_prologue();
COMPILER2_OR_JVMCI_PRESENT(DerivedPointerTable::clear());
CodeCache::on_gc_marking_cycle_start();
ClassUnloadingContext ctx(1 /* num_nmethod_unlink_workers */,
false /* unregister_nmethods_during_purge */,
false /* lock_nmethod_free_separately */);
STWGCTimer* gc_timer = SerialFullGC::gc_timer();
gc_timer->register_gc_start();
@ -630,13 +627,6 @@ void SerialHeap::do_full_collection(bool clear_all_soft_refs) {
_old_gen->compute_new_size();
_young_gen->compute_new_size();
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
ClassLoaderDataGraph::purge(/*at_safepoint*/true);
DEBUG_ONLY(MetaspaceUtils::verify();)
// Need to clear claim bits for the next mark.
ClassLoaderDataGraph::clear_claimed_marks();
_old_gen->update_promote_stats();
// Resize the metaspace capacity after full collections