--- a/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp Thu Jun 27 03:33:44 2019 +0200
+++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp Thu Jun 27 11:48:32 2019 +0200
@@ -60,6 +60,10 @@
uint _worker_id;
+ // Remember the last enqueued card to avoid enqueuing the same card over and over;
+ // since we only ever scan a card once, this is sufficient.
+ size_t _last_enqueued_card;
+
// Upper and lower threshold to start and end work queue draining.
uint const _stack_trim_upper_threshold;
uint const _stack_trim_lower_threshold;
@@ -128,8 +132,9 @@
}
size_t card_index = ct()->index_for(p);
// If the card hasn't been added to the buffer, do it.
- if (ct()->mark_card_deferred(card_index)) {
+ if (_last_enqueued_card != card_index) {
dirty_card_queue().enqueue(ct()->byte_for_index(card_index));
+ _last_enqueued_card = card_index;
}
}