8224751: Shenandoah: Shenandoah Verifier should select proper roots according to current GC cycle
Reviewed-by: rkennke
This commit is contained in:
parent
5461726dcc
commit
a7307e2709
@ -59,7 +59,7 @@ void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
|
||||
}
|
||||
|
||||
if (verify(CLDGRoots)) {
|
||||
CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
|
||||
CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
|
||||
ClassLoaderDataGraph::cld_do(&clds);
|
||||
}
|
||||
|
||||
@ -88,3 +88,49 @@ void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
|
||||
Threads::possibly_parallel_oops_do(false, oops, &blobs);
|
||||
}
|
||||
}
|
||||
|
||||
void ShenandoahRootVerifier::roots_do(OopClosure* oops) {
|
||||
CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations);
|
||||
CodeCache::blobs_do(&blobs);
|
||||
|
||||
CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
|
||||
ClassLoaderDataGraph::cld_do(&clds);
|
||||
|
||||
Universe::oops_do(oops);
|
||||
Management::oops_do(oops);
|
||||
JvmtiExport::oops_do(oops);
|
||||
JNIHandles::oops_do(oops);
|
||||
ObjectSynchronizer::oops_do(oops);
|
||||
SystemDictionary::oops_do(oops);
|
||||
|
||||
AlwaysTrueClosure always_true;
|
||||
WeakProcessor::weak_oops_do(&always_true, oops);
|
||||
|
||||
if (ShenandoahStringDedup::is_enabled()) {
|
||||
ShenandoahStringDedup::oops_do_slow(oops);
|
||||
}
|
||||
|
||||
// Do thread roots the last. This allows verification code to find
|
||||
// any broken objects from those special roots first, not the accidental
|
||||
// dangling reference from the thread root.
|
||||
Threads::possibly_parallel_oops_do(false, oops, &blobs);
|
||||
}
|
||||
|
||||
void ShenandoahRootVerifier::strong_roots_do(OopClosure* oops) {
|
||||
CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations);
|
||||
|
||||
CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
|
||||
ClassLoaderDataGraph::roots_cld_do(&clds, NULL);
|
||||
|
||||
Universe::oops_do(oops);
|
||||
Management::oops_do(oops);
|
||||
JvmtiExport::oops_do(oops);
|
||||
JNIHandles::oops_do(oops);
|
||||
ObjectSynchronizer::oops_do(oops);
|
||||
SystemDictionary::oops_do(oops);
|
||||
|
||||
// Do thread roots the last. This allows verification code to find
|
||||
// any broken objects from those special roots first, not the accidental
|
||||
// dangling reference from the thread root.
|
||||
Threads::possibly_parallel_oops_do(false, oops, &blobs);
|
||||
}
|
||||
|
@ -48,6 +48,9 @@ public:
|
||||
void excludes(RootTypes types);
|
||||
void oops_do(OopClosure* cl);
|
||||
|
||||
// Used to seed ShenandoahVerifier, do not honor root type filter
|
||||
void roots_do(OopClosure* cl);
|
||||
void strong_roots_do(OopClosure* cl);
|
||||
private:
|
||||
bool verify(RootTypes type) const;
|
||||
};
|
||||
|
@ -458,7 +458,11 @@ public:
|
||||
ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
|
||||
ShenandoahMessageBuffer("%s, Roots", _label),
|
||||
_options);
|
||||
_verifier->oops_do(&cl);
|
||||
if (_heap->unload_classes()) {
|
||||
_verifier->strong_roots_do(&cl);
|
||||
} else {
|
||||
_verifier->roots_do(&cl);
|
||||
}
|
||||
}
|
||||
|
||||
size_t processed = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user