8278627: Shenandoah: TestHeapDump test failed

Reviewed-by: shade, rkennke
This commit is contained in:
Zhengyu Gu 2021-12-21 19:02:01 +00:00
parent 54517fa3d8
commit 1128674d7f
3 changed files with 46 additions and 29 deletions

View File

@ -227,7 +227,7 @@ ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosur
void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) { void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
nmethod* const nm = cb->as_nmethod_or_null(); nmethod* const nm = cb->as_nmethod_or_null();
if (nm != NULL && nm->oops_do_try_claim()) { if (nm != NULL) {
assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here"); assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
CodeBlobToOopClosure::do_code_blob(cb); CodeBlobToOopClosure::do_code_blob(cb);
_bs->disarm(nm); _bs->disarm(nm);

View File

@ -79,7 +79,6 @@ ShenandoahThreadRoots::~ShenandoahThreadRoots() {
} }
ShenandoahCodeCacheRoots::ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase) : _phase(phase) { ShenandoahCodeCacheRoots::ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase) : _phase(phase) {
nmethod::oops_do_marking_prologue();
} }
void ShenandoahCodeCacheRoots::code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id) { void ShenandoahCodeCacheRoots::code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id) {
@ -87,10 +86,6 @@ void ShenandoahCodeCacheRoots::code_blobs_do(CodeBlobClosure* blob_cl, uint work
_coderoots_iterator.possibly_parallel_blobs_do(blob_cl); _coderoots_iterator.possibly_parallel_blobs_do(blob_cl);
} }
ShenandoahCodeCacheRoots::~ShenandoahCodeCacheRoots() {
nmethod::oops_do_marking_epilogue();
}
ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) : ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) :
_heap(ShenandoahHeap::heap()), _heap(ShenandoahHeap::heap()),
_phase(phase), _phase(phase),
@ -250,29 +245,52 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
} }
ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner(uint n_workers) : ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner(uint n_workers) :
ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots), ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
_thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/), _thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/),
_vm_roots(ShenandoahPhaseTimings::heap_iteration_roots), _vm_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_cld_roots(ShenandoahPhaseTimings::heap_iteration_roots, n_workers, true /*heap iteration*/), _cld_roots(ShenandoahPhaseTimings::heap_iteration_roots, n_workers, true /*heap iteration*/),
_weak_roots(ShenandoahPhaseTimings::heap_iteration_roots), _weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_code_roots(ShenandoahPhaseTimings::heap_iteration_roots) { _code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
} }
void ShenandoahHeapIterationRootScanner::roots_do(OopClosure* oops) { class ShenandoahMarkCodeBlobClosure : public CodeBlobClosure {
// Must use _claim_other to avoid interfering with concurrent CLDG iteration private:
CLDToOopClosure clds(oops, ClassLoaderData::_claim_other); OopClosure* const _oops;
MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations); BarrierSetNMethod* const _bs_nm;
ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
AlwaysTrueClosure always_true;
ResourceMark rm; public:
ShenandoahMarkCodeBlobClosure(OopClosure* oops) :
_oops(oops),
_bs_nm(BarrierSet::barrier_set()->barrier_set_nmethod()) {}
// Process light-weight/limited parallel roots then virtual void do_code_blob(CodeBlob* cb) {
_vm_roots.oops_do(oops, 0); nmethod* const nm = cb->as_nmethod_or_null();
_weak_roots.oops_do<OopClosure>(oops, 0); if (nm != nullptr) {
_cld_roots.cld_do(&clds, 0); if (_bs_nm != nullptr) {
// Make sure it only sees to-space objects
_bs_nm->nmethod_entry_barrier(nm);
}
ShenandoahNMethod* const snm = ShenandoahNMethod::gc_data(nm);
assert(snm != nullptr, "Sanity");
snm->oops_do(_oops, false /*fix_relocations*/);
}
}
};
// Process heavy-weight/fully parallel roots the last void ShenandoahHeapIterationRootScanner::roots_do(OopClosure* oops) {
_code_roots.code_blobs_do(&code, 0); // Must use _claim_other to avoid interfering with concurrent CLDG iteration
_thread_roots.threads_do(&tc_cl, 0); CLDToOopClosure clds(oops, ClassLoaderData::_claim_other);
} ShenandoahMarkCodeBlobClosure code(oops);
ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
ResourceMark rm;
// Process light-weight/limited parallel roots then
_vm_roots.oops_do(oops, 0);
_weak_roots.oops_do<OopClosure>(oops, 0);
_cld_roots.cld_do(&clds, 0);
// Process heavy-weight/fully parallel roots the last
_code_roots.code_blobs_do(&code, 0);
_thread_roots.threads_do(&tc_cl, 0);
}

View File

@ -102,7 +102,6 @@ private:
ShenandoahCodeRootsIterator _coderoots_iterator; ShenandoahCodeRootsIterator _coderoots_iterator;
public: public:
ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase); ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase);
~ShenandoahCodeCacheRoots();
void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id); void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
}; };