Mercurial > hg > graal-jvmci-8
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, |