8272327: Shenandoah: Avoid enqueuing duplicate string candidates

Reviewed-by: rkennke
This commit is contained in:
Zhengyu Gu 2021-08-17 00:35:18 +00:00
parent 3fb19279da
commit ee8bf10d32
3 changed files with 10 additions and 2 deletions

View File

@ -261,7 +261,9 @@ inline void ShenandoahMark::mark_through_ref(T* p, ShenandoahObjToScanQueue* q,
if ((STRING_DEDUP == ENQUEUE_DEDUP) && ShenandoahStringDedup::is_candidate(obj)) {
assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
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");
req->add(obj);
}

View File

@ -31,6 +31,7 @@ class ShenandoahStringDedup : public StringDedup {
public:
static inline bool is_string_candidate(oop obj);
static inline bool is_candidate(oop obj);
static inline bool dedup_requested(oop obj);
};
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP

View File

@ -36,6 +36,10 @@ bool ShenandoahStringDedup::is_string_candidate(oop obj) {
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) {
if (!is_string_candidate(obj)) {
return false;
@ -51,7 +55,8 @@ bool ShenandoahStringDedup::is_candidate(oop obj) {
// Increase string age and enqueue it when it rearches age threshold
markWord new_mark = mark.incr_age();
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;