Skip to content

Commit b7c1456

Browse files
committed
8276696: ParallelObjectIterator freed at the wrong time in VM_HeapDumper
Reviewed-by: ogillespie, phh Backport-of: f4dc03ea6de327425ff265c3d2ec16ea7b0e1634
1 parent e28a5ea commit b7c1456

14 files changed

+51
-29
lines changed

src/hotspot/share/gc/g1/g1CollectedHeap.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,7 +2267,7 @@ void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
22672267
heap_region_iterate(&blk);
22682268
}
22692269

2270-
class G1ParallelObjectIterator : public ParallelObjectIterator {
2270+
class G1ParallelObjectIterator : public ParallelObjectIteratorImpl {
22712271
private:
22722272
G1CollectedHeap* _heap;
22732273
HeapRegionClaimer _claimer;
@@ -2282,7 +2282,7 @@ class G1ParallelObjectIterator : public ParallelObjectIterator {
22822282
}
22832283
};
22842284

2285-
ParallelObjectIterator* G1CollectedHeap::parallel_object_iterator(uint thread_num) {
2285+
ParallelObjectIteratorImpl* G1CollectedHeap::parallel_object_iterator(uint thread_num) {
22862286
return new G1ParallelObjectIterator(thread_num);
22872287
}
22882288

src/hotspot/share/gc/g1/g1CollectedHeap.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ class G1CollectedHeap : public CollectedHeap {
12051205
// Iterate over all objects, calling "cl.do_object" on each.
12061206
virtual void object_iterate(ObjectClosure* cl);
12071207

1208-
virtual ParallelObjectIterator* parallel_object_iterator(uint thread_num);
1208+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint thread_num);
12091209

12101210
// Keep alive an object that was loaded with AS_NO_KEEPALIVE.
12111211
virtual void keep_alive(oop obj);

src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ void ParallelScavengeHeap::object_iterate_parallel(ObjectClosure* cl,
588588
}
589589
}
590590

591-
class PSScavengeParallelObjectIterator : public ParallelObjectIterator {
591+
class PSScavengeParallelObjectIterator : public ParallelObjectIteratorImpl {
592592
private:
593593
ParallelScavengeHeap* _heap;
594594
HeapBlockClaimer _claimer;
@@ -603,7 +603,7 @@ class PSScavengeParallelObjectIterator : public ParallelObjectIterator {
603603
}
604604
};
605605

606-
ParallelObjectIterator* ParallelScavengeHeap::parallel_object_iterator(uint thread_num) {
606+
ParallelObjectIteratorImpl* ParallelScavengeHeap::parallel_object_iterator(uint thread_num) {
607607
return new PSScavengeParallelObjectIterator();
608608
}
609609

src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ class ParallelScavengeHeap : public CollectedHeap {
211211

212212
void object_iterate(ObjectClosure* cl);
213213
void object_iterate_parallel(ObjectClosure* cl, HeapBlockClaimer* claimer);
214-
virtual ParallelObjectIterator* parallel_object_iterator(uint thread_num);
214+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint thread_num);
215215

216216
HeapWord* block_start(const void* addr) const;
217217
bool block_is_obj(const HeapWord* addr) const;

src/hotspot/share/gc/shared/collectedHeap.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@ void GCHeapLog::log_heap(CollectedHeap* heap, bool before) {
110110
st.print_cr("}");
111111
}
112112

113+
ParallelObjectIterator::ParallelObjectIterator(uint thread_num) :
114+
_impl(Universe::heap()->parallel_object_iterator(thread_num))
115+
{}
116+
117+
ParallelObjectIterator::~ParallelObjectIterator() {
118+
delete _impl;
119+
}
120+
121+
void ParallelObjectIterator::object_iterate(ObjectClosure* cl, uint worker_id) {
122+
_impl->object_iterate(cl, worker_id);
123+
}
124+
113125
size_t CollectedHeap::unused() const {
114126
MutexLocker ml(Heap_lock);
115127
return capacity() - used();

src/hotspot/share/gc/shared/collectedHeap.hpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,23 @@ class VirtualSpaceSummary;
6262
class WorkGang;
6363
class nmethod;
6464

65-
class ParallelObjectIterator : public CHeapObj<mtGC> {
65+
class ParallelObjectIteratorImpl : public CHeapObj<mtGC> {
6666
public:
67+
virtual ~ParallelObjectIteratorImpl() {}
6768
virtual void object_iterate(ObjectClosure* cl, uint worker_id) = 0;
68-
virtual ~ParallelObjectIterator() {}
69+
};
70+
71+
// User facing parallel object iterator. This is a StackObj, which ensures that
72+
// the _impl is allocated and deleted in the scope of this object. This ensures
73+
// the life cycle of the implementation is as required by ThreadsListHandle,
74+
// which is sometimes used by the root iterators.
75+
class ParallelObjectIterator : public StackObj {
76+
ParallelObjectIteratorImpl* _impl;
77+
78+
public:
79+
ParallelObjectIterator(uint thread_num);
80+
~ParallelObjectIterator();
81+
void object_iterate(ObjectClosure* cl, uint worker_id);
6982
};
7083

7184
//
@@ -82,6 +95,7 @@ class CollectedHeap : public CHeapObj<mtGC> {
8295
friend class JVMCIVMStructs;
8396
friend class IsGCActiveMark; // Block structured external access to _is_gc_active
8497
friend class MemAllocator;
98+
friend class ParallelObjectIterator;
8599

86100
private:
87101
GCHeapLog* _gc_heap_log;
@@ -382,10 +396,12 @@ class CollectedHeap : public CHeapObj<mtGC> {
382396
// Iterate over all objects, calling "cl.do_object" on each.
383397
virtual void object_iterate(ObjectClosure* cl) = 0;
384398

385-
virtual ParallelObjectIterator* parallel_object_iterator(uint thread_num) {
399+
protected:
400+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint thread_num) {
386401
return NULL;
387402
}
388403

404+
public:
389405
// Keep alive an object that was loaded with AS_NO_KEEPALIVE.
390406
virtual void keep_alive(oop obj) {}
391407

src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,7 +1374,7 @@ class ShenandoahObjectIterateParScanClosure : public BasicOopIterateClosure {
13741374
// parallel marking queues.
13751375
// Every worker processes it's own marking queue. work-stealing is used
13761376
// to balance workload.
1377-
class ShenandoahParallelObjectIterator : public ParallelObjectIterator {
1377+
class ShenandoahParallelObjectIterator : public ParallelObjectIteratorImpl {
13781378
private:
13791379
uint _num_workers;
13801380
bool _init_ready;
@@ -1474,7 +1474,7 @@ class ShenandoahParallelObjectIterator : public ParallelObjectIterator {
14741474
}
14751475
};
14761476

1477-
ParallelObjectIterator* ShenandoahHeap::parallel_object_iterator(uint workers) {
1477+
ParallelObjectIteratorImpl* ShenandoahHeap::parallel_object_iterator(uint workers) {
14781478
return new ShenandoahParallelObjectIterator(workers, &_aux_bit_map);
14791479
}
14801480

src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ class ShenandoahHeap : public CollectedHeap {
479479
// Used for native heap walkers: heap dumpers, mostly
480480
void object_iterate(ObjectClosure* cl);
481481
// Parallel heap iteration support
482-
virtual ParallelObjectIterator* parallel_object_iterator(uint workers);
482+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint workers);
483483

484484
// Keep alive an object that was loaded with AS_NO_KEEPALIVE.
485485
void keep_alive(oop obj);

src/hotspot/share/gc/z/zCollectedHeap.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void ZCollectedHeap::object_iterate(ObjectClosure* cl) {
243243
_heap.object_iterate(cl, true /* visit_weaks */);
244244
}
245245

246-
ParallelObjectIterator* ZCollectedHeap::parallel_object_iterator(uint nworkers) {
246+
ParallelObjectIteratorImpl* ZCollectedHeap::parallel_object_iterator(uint nworkers) {
247247
return _heap.parallel_object_iterator(nworkers, true /* visit_weaks */);
248248
}
249249

src/hotspot/share/gc/z/zCollectedHeap.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class ZCollectedHeap : public CollectedHeap {
9595
virtual GrowableArray<MemoryPool*> memory_pools();
9696

9797
virtual void object_iterate(ObjectClosure* cl);
98-
virtual ParallelObjectIterator* parallel_object_iterator(uint nworkers);
98+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint nworkers);
9999

100100
virtual void keep_alive(oop obj);
101101

0 commit comments

Comments
 (0)