< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahUnload.cpp
Print this page
rev 59240 : 8244759: Shenandoah: print verbose class unloading counters
Reviewed-by: XXX
*** 35,44 ****
--- 35,45 ----
#include "gc/shenandoah/shenandoahCodeRoots.hpp"
#include "gc/shenandoah/shenandoahConcurrentRoots.hpp"
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
#include "gc/shenandoah/shenandoahNMethod.inline.hpp"
#include "gc/shenandoah/shenandoahLock.hpp"
+ #include "gc/shenandoah/shenandoahPhaseTimings.hpp"
#include "gc/shenandoah/shenandoahRootProcessor.hpp"
#include "gc/shenandoah/shenandoahUnload.hpp"
#include "gc/shenandoah/shenandoahVerifier.hpp"
#include "memory/iterator.hpp"
#include "memory/resourceArea.hpp"
*** 133,187 ****
assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Sanity");
CodeCache::increment_unloading_cycle();
DependencyContext::cleaning_start();
}
- void ShenandoahUnload::unlink() {
- SuspendibleThreadSetJoiner sts;
- bool unloading_occurred;
- ShenandoahHeap* const heap = ShenandoahHeap::heap();
- {
- MutexLocker cldg_ml(ClassLoaderDataGraph_lock);
- unloading_occurred = SystemDictionary::do_unloading(heap->gc_timer());
- }
-
- Klass::clean_weak_klass_links(unloading_occurred);
- ShenandoahCodeRoots::unlink(ShenandoahHeap::heap()->workers(), unloading_occurred);
- DependencyContext::cleaning_end();
- }
-
- void ShenandoahUnload::purge() {
- {
- SuspendibleThreadSetJoiner sts;
- ShenandoahCodeRoots::purge(ShenandoahHeap::heap()->workers());
- }
-
- ClassLoaderDataGraph::purge();
- CodeCache::purge_exception_caches();
- }
-
class ShenandoahUnloadRendezvousClosure : public HandshakeClosure {
public:
ShenandoahUnloadRendezvousClosure() : HandshakeClosure("ShenandoahUnloadRendezvous") {}
void do_thread(Thread* thread) {}
};
void ShenandoahUnload::unload() {
assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Why we here?");
! if (!ShenandoahHeap::heap()->is_concurrent_weak_root_in_progress()) {
return;
}
// Unlink stale metadata and nmethods
! unlink();
// Make sure stale metadata and nmethods are no longer observable
! ShenandoahUnloadRendezvousClosure cl;
! Handshake::execute(&cl);
// Purge stale metadata and nmethods that were unlinked
! purge();
}
void ShenandoahUnload::finish() {
MetaspaceGC::compute_new_size();
MetaspaceUtils::verify_metrics();
--- 134,210 ----
assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Sanity");
CodeCache::increment_unloading_cycle();
DependencyContext::cleaning_start();
}
class ShenandoahUnloadRendezvousClosure : public HandshakeClosure {
public:
ShenandoahUnloadRendezvousClosure() : HandshakeClosure("ShenandoahUnloadRendezvous") {}
void do_thread(Thread* thread) {}
};
void ShenandoahUnload::unload() {
assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Why we here?");
!
! ShenandoahHeap* heap = ShenandoahHeap::heap();
!
! if (!heap->is_concurrent_weak_root_in_progress()) {
return;
}
// Unlink stale metadata and nmethods
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_unlink);
!
! SuspendibleThreadSetJoiner sts;
! bool unloadingOccurred;
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_unlink_sd);
! MutexLocker cldgMl(ClassLoaderDataGraph_lock);
! unloadingOccurred = SystemDictionary::do_unloading(heap->gc_timer());
! }
!
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_unlink_weak_klass);
! Klass::clean_weak_klass_links(unloadingOccurred);
! }
!
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_unlink_code_roots);
! ShenandoahCodeRoots::unlink(heap->workers(), unloadingOccurred);
! }
!
! DependencyContext::cleaning_end();
! }
// Make sure stale metadata and nmethods are no longer observable
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_rendezvous);
! ShenandoahUnloadRendezvousClosure cl;
! Handshake::execute(&cl);
! }
// Purge stale metadata and nmethods that were unlinked
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_purge);
!
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_purge_coderoots);
! SuspendibleThreadSetJoiner sts;
! ShenandoahCodeRoots::purge(heap->workers());
! }
!
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_purge_cldg);
! ClassLoaderDataGraph::purge();
! }
!
! {
! ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_class_unload_purge_ec);
! CodeCache::purge_exception_caches();
! }
! }
}
void ShenandoahUnload::finish() {
MetaspaceGC::compute_new_size();
MetaspaceUtils::verify_metrics();
< prev index next >