--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Sun Aug 02 22:33:27 2009 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Mon Aug 03 12:59:30 2009 -0700
@@ -1637,6 +1637,9 @@
void G1CollectedHeap::iterate_dirty_card_closure(bool concurrent,
int worker_i) {
+ // Clean cards in the hot card cache
+ concurrent_g1_refine()->clean_up_cache(worker_i, g1_rem_set());
+
DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
int n_completed_buffers = 0;
while (dcqs.apply_closure_to_completed_buffer(worker_i, 0, true)) {
@@ -1645,9 +1648,6 @@
g1_policy()->record_update_rs_processed_buffers(worker_i,
(double) n_completed_buffers);
dcqs.clear_n_completed_buffers();
- // Finish up the queue...
- if (worker_i == 0) concurrent_g1_refine()->clean_up_cache(worker_i,
- g1_rem_set());
assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
}
@@ -4111,6 +4111,8 @@
g1_rem_set()->prepare_for_oops_into_collection_set_do();
concurrent_g1_refine()->set_use_cache(false);
+ concurrent_g1_refine()->clear_hot_cache_claimed_index();
+
int n_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1);
set_par_threads(n_workers);
G1ParTask g1_par_task(this, n_workers, _task_queues);
@@ -4143,6 +4145,7 @@
}
g1_rem_set()->cleanup_after_oops_into_collection_set_do();
+ concurrent_g1_refine()->clear_hot_cache();
concurrent_g1_refine()->set_use_cache(true);
finalize_for_evac_failure();