Skip to content

Commit f4dc03e

Browse files
committed
8276696: ParallelObjectIterator freed at the wrong time in VM_HeapDumper
Reviewed-by: pliden, stefank
1 parent 90f96fb commit f4dc03e

15 files changed

+59
-35
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,7 +2260,7 @@ void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
22602260
heap_region_iterate(&blk);
22612261
}
22622262

2263-
class G1ParallelObjectIterator : public ParallelObjectIterator {
2263+
class G1ParallelObjectIterator : public ParallelObjectIteratorImpl {
22642264
private:
22652265
G1CollectedHeap* _heap;
22662266
HeapRegionClaimer _claimer;
@@ -2275,7 +2275,7 @@ class G1ParallelObjectIterator : public ParallelObjectIterator {
22752275
}
22762276
};
22772277

2278-
ParallelObjectIterator* G1CollectedHeap::parallel_object_iterator(uint thread_num) {
2278+
ParallelObjectIteratorImpl* G1CollectedHeap::parallel_object_iterator(uint thread_num) {
22792279
return new G1ParallelObjectIterator(thread_num);
22802280
}
22812281

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

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

1080-
ParallelObjectIterator* parallel_object_iterator(uint thread_num) override;
1080+
ParallelObjectIteratorImpl* parallel_object_iterator(uint thread_num) override;
10811081

10821082
// Keep alive an object that was loaded with AS_NO_KEEPALIVE.
10831083
void keep_alive(oop obj) override;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ void ParallelScavengeHeap::object_iterate_parallel(ObjectClosure* cl,
600600
}
601601
}
602602

603-
class PSScavengeParallelObjectIterator : public ParallelObjectIterator {
603+
class PSScavengeParallelObjectIterator : public ParallelObjectIteratorImpl {
604604
private:
605605
ParallelScavengeHeap* _heap;
606606
HeapBlockClaimer _claimer;
@@ -615,7 +615,7 @@ class PSScavengeParallelObjectIterator : public ParallelObjectIterator {
615615
}
616616
};
617617

618-
ParallelObjectIterator* ParallelScavengeHeap::parallel_object_iterator(uint thread_num) {
618+
ParallelObjectIteratorImpl* ParallelScavengeHeap::parallel_object_iterator(uint thread_num) {
619619
return new PSScavengeParallelObjectIterator();
620620
}
621621

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

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

232232
void object_iterate(ObjectClosure* cl);
233233
void object_iterate_parallel(ObjectClosure* cl, HeapBlockClaimer* claimer);
234-
virtual ParallelObjectIterator* parallel_object_iterator(uint thread_num);
234+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint thread_num);
235235

236236
HeapWord* block_start(const void* addr) const;
237237
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 WorkerThreads;
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<mtInternal> {
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;
@@ -384,10 +398,12 @@ class CollectedHeap : public CHeapObj<mtInternal> {
384398
// Iterate over all objects, calling "cl.do_object" on each.
385399
virtual void object_iterate(ObjectClosure* cl) = 0;
386400

387-
virtual ParallelObjectIterator* parallel_object_iterator(uint thread_num) {
401+
protected:
402+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint thread_num) {
388403
return NULL;
389404
}
390405

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,7 +1366,7 @@ class ShenandoahObjectIterateParScanClosure : public BasicOopIterateClosure {
13661366
// parallel marking queues.
13671367
// Every worker processes it's own marking queue. work-stealing is used
13681368
// to balance workload.
1369-
class ShenandoahParallelObjectIterator : public ParallelObjectIterator {
1369+
class ShenandoahParallelObjectIterator : public ParallelObjectIteratorImpl {
13701370
private:
13711371
uint _num_workers;
13721372
bool _init_ready;
@@ -1465,7 +1465,7 @@ class ShenandoahParallelObjectIterator : public ParallelObjectIterator {
14651465
}
14661466
};
14671467

1468-
ParallelObjectIterator* ShenandoahHeap::parallel_object_iterator(uint workers) {
1468+
ParallelObjectIteratorImpl* ShenandoahHeap::parallel_object_iterator(uint workers) {
14691469
return new ShenandoahParallelObjectIterator(workers, &_aux_bit_map);
14701470
}
14711471

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ class ShenandoahHeap : public CollectedHeap {
484484
// Used for native heap walkers: heap dumpers, mostly
485485
void object_iterate(ObjectClosure* cl);
486486
// Parallel heap iteration support
487-
virtual ParallelObjectIterator* parallel_object_iterator(uint workers);
487+
virtual ParallelObjectIteratorImpl* parallel_object_iterator(uint workers);
488488

489489
// Keep alive an object that was loaded with AS_NO_KEEPALIVE.
490490
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
@@ -226,7 +226,7 @@ void ZCollectedHeap::object_iterate(ObjectClosure* cl) {
226226
_heap.object_iterate(cl, true /* visit_weaks */);
227227
}
228228

229-
ParallelObjectIterator* ZCollectedHeap::parallel_object_iterator(uint nworkers) {
229+
ParallelObjectIteratorImpl* ZCollectedHeap::parallel_object_iterator(uint nworkers) {
230230
return _heap.parallel_object_iterator(nworkers, true /* visit_weaks */);
231231
}
232232

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)