8272327: Shenandoah: Avoid enqueuing duplicate string candidates
Reviewed-by: rkennke
This commit is contained in:
parent
3fb19279da
commit
ee8bf10d32
src/hotspot/share/gc/shenandoah
@ -261,7 +261,9 @@ inline void ShenandoahMark::mark_through_ref(T* p, ShenandoahObjToScanQueue* q,
|
|||||||
if ((STRING_DEDUP == ENQUEUE_DEDUP) && ShenandoahStringDedup::is_candidate(obj)) {
|
if ((STRING_DEDUP == ENQUEUE_DEDUP) && ShenandoahStringDedup::is_candidate(obj)) {
|
||||||
assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
|
assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
|
||||||
req->add(obj);
|
req->add(obj);
|
||||||
} else if ((STRING_DEDUP == ALWAYS_DEDUP) && ShenandoahStringDedup::is_string_candidate(obj)) {
|
} else if ((STRING_DEDUP == ALWAYS_DEDUP) &&
|
||||||
|
ShenandoahStringDedup::is_string_candidate(obj) &&
|
||||||
|
!ShenandoahStringDedup::dedup_requested(obj)) {
|
||||||
assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
|
assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
|
||||||
req->add(obj);
|
req->add(obj);
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ class ShenandoahStringDedup : public StringDedup {
|
|||||||
public:
|
public:
|
||||||
static inline bool is_string_candidate(oop obj);
|
static inline bool is_string_candidate(oop obj);
|
||||||
static inline bool is_candidate(oop obj);
|
static inline bool is_candidate(oop obj);
|
||||||
|
static inline bool dedup_requested(oop obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP
|
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP
|
||||||
|
@ -36,6 +36,10 @@ bool ShenandoahStringDedup::is_string_candidate(oop obj) {
|
|||||||
java_lang_String::value(obj) != nullptr;
|
java_lang_String::value(obj) != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ShenandoahStringDedup::dedup_requested(oop obj) {
|
||||||
|
return java_lang_String::test_and_set_deduplication_requested(obj);
|
||||||
|
}
|
||||||
|
|
||||||
bool ShenandoahStringDedup::is_candidate(oop obj) {
|
bool ShenandoahStringDedup::is_candidate(oop obj) {
|
||||||
if (!is_string_candidate(obj)) {
|
if (!is_string_candidate(obj)) {
|
||||||
return false;
|
return false;
|
||||||
@ -51,7 +55,8 @@ bool ShenandoahStringDedup::is_candidate(oop obj) {
|
|||||||
// Increase string age and enqueue it when it rearches age threshold
|
// Increase string age and enqueue it when it rearches age threshold
|
||||||
markWord new_mark = mark.incr_age();
|
markWord new_mark = mark.incr_age();
|
||||||
if (mark == obj->cas_set_mark(new_mark, mark)) {
|
if (mark == obj->cas_set_mark(new_mark, mark)) {
|
||||||
return StringDedup::is_threshold_age(new_mark.age());
|
return StringDedup::is_threshold_age(new_mark.age()) &&
|
||||||
|
!dedup_requested(obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user