8225550: Shenandoah: Prevent SH::object_iterate() call's side-effects

Reviewed-by: shade
This commit is contained in:
Zhengyu Gu 2019-06-14 11:58:23 -04:00
parent 5370654910
commit 9a2f403a3f
3 changed files with 20 additions and 1 deletions

View File

@ -1279,7 +1279,12 @@ void ShenandoahHeap::object_iterate(ObjectClosure* cl) {
// First, we process all GC roots. This populates the work stack with initial objects.
ShenandoahAllRootScanner rp(1, ShenandoahPhaseTimings::_num_phases);
ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
rp.roots_do_unchecked(&oops);
if (unload_classes()) {
rp.strong_roots_do_unchecked(&oops);
} else {
rp.roots_do_unchecked(&oops);
}
// Work through the oop stack to traverse heap.
while (! oop_stack.is_empty()) {

View File

@ -148,6 +148,7 @@ public:
void roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc = NULL);
// For heap object iteration
void roots_do_unchecked(OopClosure* cl);
void strong_roots_do_unchecked(OopClosure* cl);
};
typedef ShenandoahRootScanner<ShenandoahAllCodeRootsIterator> ShenandoahAllRootScanner;

View File

@ -125,6 +125,19 @@ void ShenandoahRootScanner<ITR>::roots_do_unchecked(OopClosure* oops) {
_code_roots.code_blobs_do(&code, 0);
}
template <typename ITR>
void ShenandoahRootScanner<ITR>::strong_roots_do_unchecked(OopClosure* oops) {
CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
ResourceMark rm;
_serial_roots.oops_do(oops, 0);
_jni_roots.oops_do(oops, 0);
_cld_roots.clds_do(&clds, NULL, 0);
_thread_roots.threads_do(&tc_cl, 0);
}
template <typename ITR>
void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) {
assert(ShenandoahHeap::heap()->unload_classes(), "Should be used during class unloading");