# HG changeset patch # Parent 5caef9d36283bdfbc434f5e1b553fe38efa96728 diff -r 5caef9d36283 src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp Thu Nov 28 13:08:08 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp Thu Nov 28 16:57:14 2019 +0100 @@ -462,8 +462,8 @@ ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld, ShenandoahMessageBuffer("%s, Roots", _label), _options); - if (_heap->unload_classes()) { - _verifier->strong_roots_do(&cl); + if (_options._verify_roots == ShenandoahVerifier::_verify_strong_roots) { + //_verifier->strong_roots_do(&cl); } else { _verifier->roots_do(&cl); } @@ -630,6 +630,7 @@ }; void ShenandoahVerifier::verify_at_safepoint(const char *label, + VerifyRoots roots, VerifyForwarded forwarded, VerifyMarked marked, VerifyCollectionSet cset, VerifyLiveness liveness, VerifyRegions regions, @@ -718,7 +719,7 @@ ShenandoahLivenessData* ld = NEW_C_HEAP_ARRAY(ShenandoahLivenessData, _heap->num_regions(), mtGC); Copy::fill_to_bytes((void*)ld, _heap->num_regions()*sizeof(ShenandoahLivenessData), 0); - const VerifyOptions& options = ShenandoahVerifier::VerifyOptions(forwarded, marked, cset, liveness, regions, gcstate); + const VerifyOptions& options = ShenandoahVerifier::VerifyOptions(roots, forwarded, marked, cset, liveness, regions, gcstate); // Steps 1-2. Scan root set to get initial reachable set. Finish walking the reachable heap. // This verifies what application can see, since it only cares about reachable objects. @@ -790,6 +791,7 @@ void ShenandoahVerifier::verify_generic(VerifyOption vo) { verify_at_safepoint( "Generic Verification", + _verify_strong_roots, // conservatively only check strong roots _verify_forwarded_allow, // conservatively allow forwarded _verify_marked_disable, // do not verify marked: lots ot time wasted checking dead allocations _verify_cset_disable, // cset may be inconsistent @@ -803,6 +805,7 @@ if (_heap->has_forwarded_objects()) { verify_at_safepoint( "Before Mark", + _verify_all_roots, // check all roots _verify_forwarded_allow, // may have forwarded references _verify_marked_disable, // do not verify marked: lots ot time wasted checking dead allocations _verify_cset_forwarded, // allow forwarded references to cset @@ -813,6 +816,7 @@ } else { verify_at_safepoint( "Before Mark", + _verify_all_roots, // check all roots _verify_forwarded_none, // UR should have fixed up _verify_marked_disable, // do not verify marked: lots ot time wasted checking dead allocations _verify_cset_none, // UR should have fixed this @@ -824,44 +828,87 @@ } void ShenandoahVerifier::verify_after_concmark() { - verify_at_safepoint( - "After Mark", - _verify_forwarded_none, // no forwarded references - _verify_marked_complete, // bitmaps as precise as we can get - _verify_cset_none, // no references to cset anymore - _verify_liveness_complete, // liveness data must be complete here - _verify_regions_disable, // trash regions not yet recycled - _verify_gcstate_stable // mark should have stabilized the heap - ); + if (ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) { + verify_at_safepoint( + "After Mark", + _verify_strong_roots, // check strong roots + _verify_forwarded_none, // no forwarded references + _verify_marked_complete, // bitmaps as precise as we can get + _verify_cset_none, // no references to cset anymore + _verify_liveness_complete, // liveness data must be complete here + _verify_regions_disable, // trash regions not yet recycled + _verify_gcstate_stable // mark should have stabilized the heap + ); + } else { + verify_at_safepoint( + "After Mark", + _verify_all_roots, // check all roots + _verify_forwarded_none, // no forwarded references + _verify_marked_complete, // bitmaps as precise as we can get + _verify_cset_none, // no references to cset anymore + _verify_liveness_complete, // liveness data must be complete here + _verify_regions_disable, // trash regions not yet recycled + _verify_gcstate_stable // mark should have stabilized the heap + ); + } } void ShenandoahVerifier::verify_before_evacuation() { - verify_at_safepoint( - "Before Evacuation", - _verify_forwarded_none, // no forwarded references - _verify_marked_complete, // walk over marked objects too - _verify_cset_disable, // non-forwarded references to cset expected - _verify_liveness_complete, // liveness data must be complete here - _verify_regions_disable, // trash regions not yet recycled - _verify_gcstate_stable // mark should have stabilized the heap - ); + if (ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) { + verify_at_safepoint( + "Before Evacuation", + _verify_strong_roots, // check strong roots + _verify_forwarded_none, // no forwarded references + _verify_marked_complete, // walk over marked objects too + _verify_cset_disable, // non-forwarded references to cset expected + _verify_liveness_complete, // liveness data must be complete here + _verify_regions_disable, // trash regions not yet recycled + _verify_gcstate_stable // mark should have stabilized the heap + ); + } else { + verify_at_safepoint( + "Before Evacuation", + _verify_all_roots, // check all roots + _verify_forwarded_none, // no forwarded references + _verify_marked_complete, // walk over marked objects too + _verify_cset_disable, // non-forwarded references to cset expected + _verify_liveness_complete, // liveness data must be complete here + _verify_regions_disable, // trash regions not yet recycled + _verify_gcstate_stable // mark should have stabilized the heap + ); + } } void ShenandoahVerifier::verify_during_evacuation() { - verify_at_safepoint( - "During Evacuation", - _verify_forwarded_allow, // some forwarded references are allowed - _verify_marked_disable, // walk only roots - _verify_cset_disable, // some cset references are not forwarded yet - _verify_liveness_disable, // liveness data might be already stale after pre-evacs - _verify_regions_disable, // trash regions not yet recycled - _verify_gcstate_evacuation // evacuation is in progress - ); + if (_heap->unload_classes()) { + verify_at_safepoint( + "During Evacuation", + _verify_strong_roots, // check strong roots + _verify_forwarded_allow, // some forwarded references are allowed + _verify_marked_disable, // walk only roots + _verify_cset_disable, // some cset references are not forwarded yet + _verify_liveness_disable, // liveness data might be already stale after pre-evacs + _verify_regions_disable, // trash regions not yet recycled + _verify_gcstate_evacuation // evacuation is in progress + ); + } else { + verify_at_safepoint( + "During Evacuation", + _verify_all_roots, // check all roots + _verify_forwarded_allow, // some forwarded references are allowed + _verify_marked_disable, // walk only roots + _verify_cset_disable, // some cset references are not forwarded yet + _verify_liveness_disable, // liveness data might be already stale after pre-evacs + _verify_regions_disable, // trash regions not yet recycled + _verify_gcstate_evacuation // evacuation is in progress + ); + } } void ShenandoahVerifier::verify_after_evacuation() { verify_at_safepoint( "After Evacuation", + _verify_all_roots, // check all roots _verify_forwarded_allow, // objects are still forwarded _verify_marked_complete, // bitmaps might be stale, but alloc-after-mark should be well _verify_cset_forwarded, // all cset refs are fully forwarded @@ -874,6 +921,7 @@ void ShenandoahVerifier::verify_before_updaterefs() { verify_at_safepoint( "Before Updating References", + _verify_all_roots, // check all roots _verify_forwarded_allow, // forwarded references allowed _verify_marked_complete, // bitmaps might be stale, but alloc-after-mark should be well _verify_cset_forwarded, // all cset refs are fully forwarded @@ -886,6 +934,7 @@ void ShenandoahVerifier::verify_after_updaterefs() { verify_at_safepoint( "After Updating References", + _verify_all_roots, // check all roots _verify_forwarded_none, // no forwarded references _verify_marked_complete, // bitmaps might be stale, but alloc-after-mark should be well _verify_cset_none, // no cset references, all updated @@ -898,6 +947,7 @@ void ShenandoahVerifier::verify_after_degenerated() { verify_at_safepoint( "After Degenerated GC", + _verify_all_roots, // check all roots _verify_forwarded_none, // all objects are non-forwarded _verify_marked_complete, // all objects are marked in complete bitmap _verify_cset_none, // no cset references @@ -910,6 +960,7 @@ void ShenandoahVerifier::verify_before_traversal() { verify_at_safepoint( "Before Traversal", + _verify_all_roots, // check all roots _verify_forwarded_none, // cannot have forwarded objects _verify_marked_disable, // bitmaps are not relevant before traversal _verify_cset_none, // no cset references before traversal @@ -922,6 +973,7 @@ void ShenandoahVerifier::verify_after_traversal() { verify_at_safepoint( "After Traversal", + _verify_all_roots, // check all roots _verify_forwarded_none, // cannot have forwarded objects _verify_marked_complete, // should have complete marking after traversal _verify_cset_none, // no cset references left after traversal @@ -934,6 +986,7 @@ void ShenandoahVerifier::verify_before_fullgc() { verify_at_safepoint( "Before Full GC", + _verify_all_roots, // check all roots _verify_forwarded_allow, // can have forwarded objects _verify_marked_disable, // do not verify marked: lots ot time wasted checking dead allocations _verify_cset_disable, // cset might be foobared @@ -946,6 +999,7 @@ void ShenandoahVerifier::verify_after_fullgc() { verify_at_safepoint( "After Full GC", + _verify_all_roots, // check all roots _verify_forwarded_none, // all objects are non-forwarded _verify_marked_complete, // all objects are marked in complete bitmap _verify_cset_none, // no cset references diff -r 5caef9d36283 src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp Thu Nov 28 13:08:08 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp Thu Nov 28 16:57:14 2019 +0100 @@ -141,7 +141,13 @@ _verify_gcstate_evacuation } VerifyGCState; + typedef enum { + _verify_strong_roots, + _verify_all_roots + } VerifyRoots; + struct VerifyOptions { + VerifyRoots _verify_roots; VerifyForwarded _verify_forwarded; VerifyMarked _verify_marked; VerifyCollectionSet _verify_cset; @@ -149,12 +155,14 @@ VerifyRegions _verify_regions; VerifyGCState _verify_gcstate; - VerifyOptions(VerifyForwarded verify_forwarded, + VerifyOptions(VerifyRoots verify_roots, + VerifyForwarded verify_forwarded, VerifyMarked verify_marked, VerifyCollectionSet verify_collection_set, VerifyLiveness verify_liveness, VerifyRegions verify_regions, VerifyGCState verify_gcstate) : + _verify_roots(verify_roots), _verify_forwarded(verify_forwarded), _verify_marked(verify_marked), _verify_cset(verify_collection_set), _verify_liveness(verify_liveness), _verify_regions(verify_regions), @@ -163,6 +171,7 @@ private: void verify_at_safepoint(const char *label, + VerifyRoots roots, VerifyForwarded forwarded, VerifyMarked marked, VerifyCollectionSet cset,