Skip to content

Commit 3aec2d9

Browse files
committed
8264718: Shenandoah: enable string deduplication during root scanning
Reviewed-by: shade
1 parent 255afbe commit 3aec2d9

File tree

5 files changed

+43
-30
lines changed

5 files changed

+43
-30
lines changed

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,13 @@ ShenandoahMarkConcurrentRootsTask::ShenandoahMarkConcurrentRootsTask(ShenandoahO
191191
void ShenandoahMarkConcurrentRootsTask::work(uint worker_id) {
192192
ShenandoahConcurrentWorkerSession worker_session(worker_id);
193193
ShenandoahObjToScanQueue* q = _queue_set->queue(worker_id);
194-
ShenandoahMarkRefsClosure cl(q, _rp);
195-
_root_scanner.roots_do(&cl, worker_id);
194+
if (ShenandoahStringDedup::is_enabled()) {
195+
ShenandoahMarkRefsDedupClosure cl(q, _rp);
196+
_root_scanner.roots_do(&cl, worker_id);
197+
} else {
198+
ShenandoahMarkRefsClosure cl(q, _rp);
199+
_root_scanner.roots_do(&cl, worker_id);
200+
}
196201
}
197202

198203
void ShenandoahConcurrentMark::mark_concurrent_roots() {

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

-5
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ ShenandoahMarkRefsSuperClosure::ShenandoahMarkRefsSuperClosure(ShenandoahObjToSc
4141
_weak(false)
4242
{ }
4343

44-
ShenandoahInitMarkRootsClosure::ShenandoahInitMarkRootsClosure(ShenandoahObjToScanQueue* q) :
45-
_queue(q),
46-
_mark_context(ShenandoahHeap::heap()->marking_context()) {
47-
}
48-
4944
ShenandoahMark::ShenandoahMark() :
5045
_task_queues(ShenandoahHeap::heap()->marking_context()->task_queues()) {
5146
}

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

-15
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,6 @@
3131

3232
class ShenandoahCMDrainMarkingStackClosure;
3333

34-
class ShenandoahInitMarkRootsClosure : public OopClosure {
35-
private:
36-
ShenandoahObjToScanQueue* const _queue;
37-
ShenandoahMarkingContext* const _mark_context;
38-
39-
template <class T>
40-
inline void do_oop_work(T* p);
41-
42-
public:
43-
ShenandoahInitMarkRootsClosure(ShenandoahObjToScanQueue* q);
44-
45-
void do_oop(narrowOop* p) { do_oop_work(p); }
46-
void do_oop(oop* p) { do_oop_work(p); }
47-
};
48-
4934
// Base class for mark
5035
// Mark class does not maintain states. Instead, mark states are
5136
// maintained by task queues, mark bitmap and SATB buffers (concurrent mark)

src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp

-5
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@
3939
#include "runtime/prefetch.inline.hpp"
4040
#include "utilities/powerOfTwo.hpp"
4141

42-
template <class T>
43-
void ShenandoahInitMarkRootsClosure::do_oop_work(T* p) {
44-
ShenandoahMark::mark_through_ref<T, NO_DEDUP>(p, _queue, _mark_context, false);
45-
}
46-
4742
template <class T>
4843
void ShenandoahMark::do_task(ShenandoahObjToScanQueue* q, T* cl, ShenandoahLiveData* live_data, ShenandoahMarkTask* task) {
4944
oop obj = task->obj();

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

+36-3
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,38 @@
3333
#include "gc/shenandoah/shenandoahOopClosures.inline.hpp"
3434
#include "gc/shenandoah/shenandoahReferenceProcessor.hpp"
3535
#include "gc/shenandoah/shenandoahRootProcessor.inline.hpp"
36+
#include "gc/shenandoah/shenandoahStringDedup.hpp"
3637
#include "gc/shenandoah/shenandoahSTWMark.hpp"
3738
#include "gc/shenandoah/shenandoahVerifier.hpp"
3839

40+
template <StringDedupMode STRING_DEDUP>
41+
class ShenandoahInitMarkRootsClosure : public OopClosure {
42+
private:
43+
ShenandoahObjToScanQueue* const _queue;
44+
ShenandoahMarkingContext* const _mark_context;
45+
46+
template <class T>
47+
inline void do_oop_work(T* p);
48+
49+
public:
50+
ShenandoahInitMarkRootsClosure(ShenandoahObjToScanQueue* q);
51+
52+
void do_oop(narrowOop* p) { do_oop_work(p); }
53+
void do_oop(oop* p) { do_oop_work(p); }
54+
};
55+
56+
template <StringDedupMode STRING_DEDUP>
57+
ShenandoahInitMarkRootsClosure<STRING_DEDUP>::ShenandoahInitMarkRootsClosure(ShenandoahObjToScanQueue* q) :
58+
_queue(q),
59+
_mark_context(ShenandoahHeap::heap()->marking_context()) {
60+
}
61+
62+
template <StringDedupMode STRING_DEDUP>
63+
template <class T>
64+
void ShenandoahInitMarkRootsClosure<STRING_DEDUP>::do_oop_work(T* p) {
65+
ShenandoahMark::mark_through_ref<T, STRING_DEDUP>(p, _queue, _mark_context, false);
66+
}
67+
3968
class ShenandoahSTWMarkTask : public AbstractGangTask {
4069
private:
4170
ShenandoahSTWMark* const _mark;
@@ -99,8 +128,13 @@ void ShenandoahSTWMark::mark() {
99128
}
100129

101130
void ShenandoahSTWMark::mark_roots(uint worker_id) {
102-
ShenandoahInitMarkRootsClosure init_mark(task_queues()->queue(worker_id));
103-
_root_scanner.roots_do(&init_mark, worker_id);
131+
if (ShenandoahStringDedup::is_enabled()) {
132+
ShenandoahInitMarkRootsClosure<ENQUEUE_DEDUP> init_mark(task_queues()->queue(worker_id));
133+
_root_scanner.roots_do(&init_mark, worker_id);
134+
} else {
135+
ShenandoahInitMarkRootsClosure<NO_DEDUP> init_mark(task_queues()->queue(worker_id));
136+
_root_scanner.roots_do(&init_mark, worker_id);
137+
}
104138
}
105139

106140
void ShenandoahSTWMark::finish_mark(uint worker_id) {
@@ -112,4 +146,3 @@ void ShenandoahSTWMark::finish_mark(uint worker_id) {
112146
false, // not cancellable
113147
ShenandoahStringDedup::is_enabled());
114148
}
115-

0 commit comments

Comments
 (0)