--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Aug 16 11:35:17 2019 -0700
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Aug 16 14:46:52 2019 -0400
@@ -1082,7 +1082,6 @@
G1BarrierSet::dirty_card_queue_set().abandon_logs();
assert(G1BarrierSet::dirty_card_queue_set().num_completed_buffers() == 0,
"DCQS should be empty");
- redirty_cards_queue_set().verify_empty();
}
void G1CollectedHeap::verify_after_full_collection() {
@@ -1521,7 +1520,6 @@
_collection_set(this, _policy),
_hot_card_cache(NULL),
_rem_set(NULL),
- _redirty_cards_queue_set(),
_cm(NULL),
_cm_thread(NULL),
_cr(NULL),
@@ -1691,9 +1689,6 @@
&bs->dirty_card_queue_buffer_allocator(),
true); // init_free_ids
- // Use same buffer allocator as dirty card qset, to allow merging.
- _redirty_cards_queue_set.initialize(&bs->dirty_card_queue_buffer_allocator());
-
// Create the hot card cache.
_hot_card_cache = new G1HotCardCache(this);
@@ -3028,7 +3023,9 @@
calculate_collection_set(evacuation_info, target_pause_time_ms);
+ G1RedirtyCardsQueueSet rdcqs(G1BarrierSet::dirty_card_queue_set().allocator());
G1ParScanThreadStateSet per_thread_states(this,
+ &rdcqs,
workers()->active_workers(),
collection_set()->young_region_length(),
collection_set()->optional_region_length());
@@ -3040,7 +3037,7 @@
if (_collection_set.optional_region_length() != 0) {
evacuate_optional_collection_set(&per_thread_states);
}
- post_evacuate_collection_set(evacuation_info, &per_thread_states);
+ post_evacuate_collection_set(evacuation_info, &rdcqs, &per_thread_states);
start_new_collection_set();
@@ -3122,15 +3119,15 @@
return true;
}
-void G1CollectedHeap::remove_self_forwarding_pointers() {
- G1ParRemoveSelfForwardPtrsTask rsfp_task;
+void G1CollectedHeap::remove_self_forwarding_pointers(G1RedirtyCardsQueueSet* rdcqs) {
+ G1ParRemoveSelfForwardPtrsTask rsfp_task(rdcqs);
workers()->run_task(&rsfp_task);
}
-void G1CollectedHeap::restore_after_evac_failure() {
+void G1CollectedHeap::restore_after_evac_failure(G1RedirtyCardsQueueSet* rdcqs) {
double remove_self_forwards_start = os::elapsedTime();
- remove_self_forwarding_pointers();
+ remove_self_forwarding_pointers(rdcqs);
SharedRestorePreservedMarksTaskExecutor task_executor(workers());
_preserved_marks_set.restore(&task_executor);
@@ -3264,15 +3261,14 @@
}
};
-void G1CollectedHeap::redirty_logged_cards() {
+void G1CollectedHeap::redirty_logged_cards(G1RedirtyCardsQueueSet* rdcqs) {
double redirty_logged_cards_start = os::elapsedTime();
- G1RedirtyLoggedCardsTask redirty_task(&redirty_cards_queue_set(), this);
+ G1RedirtyLoggedCardsTask redirty_task(rdcqs, this);
workers()->run_task(&redirty_task);
G1DirtyCardQueueSet& dcq = G1BarrierSet::dirty_card_queue_set();
- dcq.merge_bufferlists(&redirty_cards_queue_set());
- redirty_cards_queue_set().verify_empty();
+ dcq.merge_bufferlists(rdcqs);
phase_times()->record_redirty_logged_cards_time_ms((os::elapsedTime() - redirty_logged_cards_start) * 1000.0);
}
@@ -3603,8 +3599,6 @@
// Should G1EvacuationFailureALot be in effect for this GC?
NOT_PRODUCT(set_evacuation_failure_alot_for_current_gc();)
-
- redirty_cards_queue_set().verify_empty();
}
class G1EvacuateRegionsBaseTask : public AbstractGangTask {
@@ -3806,7 +3800,9 @@
_collection_set.abandon_optional_collection_set(per_thread_states);
}
-void G1CollectedHeap::post_evacuate_collection_set(G1EvacuationInfo& evacuation_info, G1ParScanThreadStateSet* per_thread_states) {
+void G1CollectedHeap::post_evacuate_collection_set(G1EvacuationInfo& evacuation_info,
+ G1RedirtyCardsQueueSet* rdcqs,
+ G1ParScanThreadStateSet* per_thread_states) {
rem_set()->cleanup_after_scan_heap_roots();
// Process any discovered reference objects - we have
@@ -3834,7 +3830,7 @@
_allocator->release_gc_alloc_regions(evacuation_info);
if (evacuation_failed()) {
- restore_after_evac_failure();
+ restore_after_evac_failure(rdcqs);
// Reset the G1EvacuationFailureALot counters and flags
NOT_PRODUCT(reset_evacuation_should_fail();)
@@ -3869,7 +3865,7 @@
purge_code_root_memory();
- redirty_logged_cards();
+ redirty_logged_cards(rdcqs);
free_collection_set(&_collection_set, evacuation_info, per_thread_states->surviving_young_words());