# HG changeset patch # User zgu # Date 1553795621 14400 # Node ID 8cd2af66ac7c46e2c4a2d4a4b182f50a1c9f9ce9 # Parent 6a1406c718ec0585abc05a29957b5c932d1ce40a 8221629: Shenandoah: Cleanup class unloading logic Reviewed-by: rkennke diff -r 6a1406c718ec -r 8cd2af66ac7c src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp Fri Mar 29 14:17:09 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp Thu Mar 28 13:53:41 2019 -0400 @@ -36,7 +36,7 @@ #include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp" #include "gc/shenandoah/shenandoahMarkCompact.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" -#include "gc/shenandoah/shenandoahRootProcessor.hpp" +#include "gc/shenandoah/shenandoahRootProcessor.inline.hpp" #include "gc/shenandoah/shenandoahOopClosures.inline.hpp" #include "gc/shenandoah/shenandoahTaskqueue.inline.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp" @@ -123,7 +123,7 @@ ResourceMark m; if (heap->unload_classes()) { - _rp->process_strong_roots(oops, &clds_cl, NULL, &blobs_cl, NULL, worker_id); + _rp->process_strong_roots(oops, &clds_cl, &blobs_cl, NULL, worker_id); } else { if (ShenandoahConcurrentScanCodeRoots) { CodeBlobClosure* code_blobs = NULL; @@ -176,7 +176,7 @@ DEBUG_ONLY(&assert_to_space) NOT_DEBUG(NULL); } - _rp->update_all_roots(&cl, &cldCl, code_blobs, NULL, worker_id); + _rp->update_all_roots(&cl, &cldCl, code_blobs, NULL, worker_id); } }; diff -r 6a1406c718ec -r 8cd2af66ac7c src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp Fri Mar 29 14:17:09 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp Thu Mar 28 13:53:41 2019 -0400 @@ -35,7 +35,7 @@ #include "gc/shenandoah/shenandoahHeap.inline.hpp" #include "gc/shenandoah/shenandoahHeuristics.hpp" #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp" -#include "gc/shenandoah/shenandoahRootProcessor.hpp" +#include "gc/shenandoah/shenandoahRootProcessor.inline.hpp" #include "gc/shenandoah/shenandoahTraversalGC.hpp" #include "gc/shenandoah/shenandoahTaskqueue.inline.hpp" #include "gc/shenandoah/shenandoahUtils.hpp" @@ -572,9 +572,9 @@ MarkingCodeBlobClosure adjust_code_closure(&cl, CodeBlobToOopClosure::FixRelocations); - _rp->update_all_roots(&cl, - &adjust_cld_closure, - &adjust_code_closure, NULL, worker_id); + _rp->update_all_roots(&cl, + &adjust_cld_closure, + &adjust_code_closure, NULL, worker_id); } }; diff -r 6a1406c718ec -r 8cd2af66ac7c src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp Fri Mar 29 14:17:09 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp Thu Mar 28 13:53:41 2019 -0400 @@ -130,12 +130,11 @@ void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops, CLDClosure* clds, - CLDClosure* weak_clds, CodeBlobClosure* blobs, ThreadClosure* thread_cl, uint worker_id) { - process_java_roots(oops, clds, weak_clds, blobs, thread_cl, worker_id); + process_java_roots(oops, clds, NULL, blobs, thread_cl, worker_id); process_vm_roots(oops, worker_id); _process_strong_tasks->all_tasks_completed(n_workers()); @@ -160,39 +159,6 @@ } -void ShenandoahRootProcessor::update_all_roots(OopClosure* oops, - CLDClosure* clds, - CodeBlobClosure* blobs, - ThreadClosure* thread_cl, - uint worker_id) { - process_all_roots(oops, clds, blobs, thread_cl, worker_id); - - AlwaysTrueClosure always_true; - _weak_processor_task.work(worker_id, &always_true, oops); - _processed_weak_roots = true; - - if (ShenandoahStringDedup::is_enabled()) { - ShenandoahStringDedup::parallel_oops_do(&always_true, oops, worker_id); - } -} - -void ShenandoahRootProcessor::traversal_update_all_roots(OopClosure* oops, - CLDClosure* clds, - CodeBlobClosure* blobs, - ThreadClosure* thread_cl, - uint worker_id) { - process_all_roots(oops, clds, blobs, thread_cl, worker_id); - - ShenandoahIsAliveSelector is_alive; - BoolObjectClosure* is_alive_closure = is_alive.is_alive_closure(); - _weak_processor_task.work(worker_id, is_alive_closure, oops); - _processed_weak_roots = true; - - if (ShenandoahStringDedup::is_enabled()) { - ShenandoahStringDedup::parallel_oops_do(is_alive_closure, oops, worker_id); - } -} - class ShenandoahParallelOopsDoThreadClosure : public ThreadClosure { private: OopClosure* _f; diff -r 6a1406c718ec -r 8cd2af66ac7c src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp Fri Mar 29 14:17:09 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp Thu Mar 28 13:53:41 2019 -0400 @@ -89,7 +89,6 @@ // for the particular GC cycles. void process_strong_roots(OopClosure* oops, CLDClosure* clds, - CLDClosure* weak_clds, CodeBlobClosure* blobs, ThreadClosure* thread_cl, uint worker_id); @@ -102,22 +101,13 @@ uint worker_id); // Apply oops, clds and blobs to strongly and weakly reachable roots in the system + template void update_all_roots(OopClosure* oops, CLDClosure* clds, CodeBlobClosure* blobs, ThreadClosure* thread_cl, uint worker_id); - - // Apply oops, clds and blobs to strongly and weakly reachable roots in the system - // during traversal GC. - // It cleans up and updates weak roots in one iteration. - void traversal_update_all_roots(OopClosure* oops, - CLDClosure* clds, - CodeBlobClosure* blobs, - ThreadClosure* thread_cl, - uint worker_id); - // For slow debug/verification code void process_all_roots_slow(OopClosure* oops); diff -r 6a1406c718ec -r 8cd2af66ac7c src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp Thu Mar 28 13:53:41 2019 -0400 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP +#define SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP + +#include "gc/shenandoah/shenandoahRootProcessor.hpp" + +template +void ShenandoahRootProcessor::update_all_roots(OopClosure* oops, + CLDClosure* clds, + CodeBlobClosure* blobs, + ThreadClosure* thread_cl, + uint worker_id) { + process_all_roots(oops, clds, blobs, thread_cl, worker_id); + + IsAlive is_alive; + _weak_processor_task.work(worker_id, &is_alive, oops); + _processed_weak_roots = true; + + if (ShenandoahStringDedup::is_enabled()) { + ShenandoahStringDedup::parallel_oops_do(&is_alive, oops, worker_id); + } +} + +#endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP diff -r 6a1406c718ec -r 8cd2af66ac7c src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp Fri Mar 29 14:17:09 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp Thu Mar 28 13:53:41 2019 -0400 @@ -40,7 +40,7 @@ #include "gc/shenandoah/shenandoahHeuristics.hpp" #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp" #include "gc/shenandoah/shenandoahOopClosures.inline.hpp" -#include "gc/shenandoah/shenandoahRootProcessor.hpp" +#include "gc/shenandoah/shenandoahRootProcessor.inline.hpp" #include "gc/shenandoah/shenandoahStringDedup.hpp" #include "gc/shenandoah/shenandoahTaskqueue.inline.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp" @@ -188,7 +188,7 @@ ShenandoahMarkCLDClosure cld_cl(&roots_cl); MarkingCodeBlobClosure code_cl(&roots_cl, CodeBlobToOopClosure::FixRelocations); if (unload_classes) { - _rp->process_strong_roots(&roots_cl, &cld_cl, NULL, NULL, NULL, worker_id); + _rp->process_strong_roots(&roots_cl, &cld_cl, NULL, NULL, worker_id); // Need to pre-evac code roots here. Otherwise we might see from-space constants. ShenandoahWorkerTimings* worker_times = _heap->phase_timings()->worker_times(); ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id); @@ -269,8 +269,8 @@ CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong); ShenandoahTraversalSATBThreadsClosure tc(&satb_cl); if (unload_classes) { - ShenandoahRemarkCLDClosure weak_cld_cl(&roots_cl); - _rp->process_strong_roots(&roots_cl, &cld_cl, &weak_cld_cl, NULL, &tc, worker_id); + ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl); + _rp->process_strong_roots(&roots_cl, &remark_cld_cl, NULL, &tc, worker_id); } else { _rp->process_all_roots(&roots_cl, &cld_cl, NULL, &tc, worker_id); } @@ -279,8 +279,8 @@ CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong); ShenandoahTraversalSATBThreadsClosure tc(&satb_cl); if (unload_classes) { - ShenandoahRemarkCLDClosure weak_cld_cl(&roots_cl); - _rp->process_strong_roots(&roots_cl, &cld_cl, &weak_cld_cl, NULL, &tc, worker_id); + ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl); + _rp->process_strong_roots(&roots_cl, &remark_cld_cl, NULL, &tc, worker_id); } else { _rp->process_all_roots(&roots_cl, &cld_cl, NULL, &tc, worker_id); } @@ -694,14 +694,16 @@ public: ShenandoahTraversalFixRootsTask(ShenandoahRootProcessor* rp) : AbstractGangTask("Shenandoah traversal fix roots"), - _rp(rp) {} + _rp(rp) { + assert(ShenandoahHeap::heap()->has_forwarded_objects(), "Must be"); + } void work(uint worker_id) { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahTraversalFixRootsClosure cl; MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations); CLDToOopClosure cldCl(&cl, ClassLoaderData::_claim_strong); - _rp->traversal_update_all_roots(&cl, &cldCl, &blobsCl, NULL, worker_id); + _rp->update_all_roots(&cl, &cldCl, &blobsCl, NULL, worker_id); } };