comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 2173:97ba643ea3ed

7014261: G1: RSet-related failures Summary: A race between the concurrent cleanup thread and the VM thread while it is processing the "expanded sparse table list" causes both threads to try to free the same sparse table entry and either causes one of the threads to fail or leaves the entry in an inconsistent state. The solution is purge all entries on the expanded list that correspond go regions that are being cleaned up. Reviewed-by: brutisso, johnc
author tonyp
date Tue, 25 Jan 2011 17:58:19 -0500
parents 0fa27f37d4d4
children c33825b68624
comparison
equal deleted inserted replaced
2172:a672e43650cc 2173:97ba643ea3ed
4923 assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed"); 4923 assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
4924 } 4924 }
4925 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); 4925 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4926 } 4926 }
4927 4927
4928 void G1CollectedHeap::free_region_if_totally_empty(HeapRegion* hr, 4928 void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
4929 size_t* pre_used, 4929 size_t* pre_used,
4930 FreeRegionList* free_list, 4930 FreeRegionList* free_list,
4931 HumongousRegionSet* humongous_proxy_set, 4931 HumongousRegionSet* humongous_proxy_set,
4932 HRRSCleanupTask* hrrs_cleanup_task,
4932 bool par) { 4933 bool par) {
4933 if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) { 4934 if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) {
4934 if (hr->isHumongous()) { 4935 if (hr->isHumongous()) {
4935 assert(hr->startsHumongous(), "we should only see starts humongous"); 4936 assert(hr->startsHumongous(), "we should only see starts humongous");
4936 free_humongous_region(hr, pre_used, free_list, humongous_proxy_set, par); 4937 free_humongous_region(hr, pre_used, free_list, humongous_proxy_set, par);
4937 } else { 4938 } else {
4938 free_region(hr, pre_used, free_list, par); 4939 free_region(hr, pre_used, free_list, par);
4939 } 4940 }
4941 } else {
4942 hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
4940 } 4943 }
4941 } 4944 }
4942 4945
4943 void G1CollectedHeap::free_region(HeapRegion* hr, 4946 void G1CollectedHeap::free_region(HeapRegion* hr,
4944 size_t* pre_used, 4947 size_t* pre_used,