mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 14:24:46 +02:00
8201492: Properly implement non-contiguous generations for Reference discovery
Collectors like G1 implementing non-contiguous generations previously used an inexact but conservative area for discovery. Concurrent and STW reference processing could discover the same reference multiple times, potentially missing referents during evacuation. So these collectors had to take extra measures while concurrent marking/reference discovery has been running. This change makes discovery exact for G1 (and any collector using non-contiguous generations) so that concurrent discovery and STW discovery discover on strictly disjoint memory areas. This means that the mentioned situation can not occur any more, and extra work is not required any more too. Reviewed-by: kbarrett, sjohanss
This commit is contained in:
parent
38854063d3
commit
945701e945
25 changed files with 233 additions and 291 deletions
|
@ -117,6 +117,7 @@ ParallelCompactData::RegionData::dc_completed = 0xcU << dc_shift;
|
|||
|
||||
SpaceInfo PSParallelCompact::_space_info[PSParallelCompact::last_space_id];
|
||||
|
||||
SpanSubjectToDiscoveryClosure PSParallelCompact::_span_based_discoverer;
|
||||
ReferenceProcessor* PSParallelCompact::_ref_processor = NULL;
|
||||
|
||||
double PSParallelCompact::_dwl_mean;
|
||||
|
@ -843,14 +844,14 @@ bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap(
|
|||
|
||||
void PSParallelCompact::post_initialize() {
|
||||
ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
|
||||
MemRegion mr = heap->reserved_region();
|
||||
_span_based_discoverer.set_span(heap->reserved_region());
|
||||
_ref_processor =
|
||||
new ReferenceProcessor(mr, // span
|
||||
new ReferenceProcessor(&_span_based_discoverer,
|
||||
ParallelRefProcEnabled && (ParallelGCThreads > 1), // mt processing
|
||||
ParallelGCThreads, // mt processing degree
|
||||
true, // mt discovery
|
||||
ParallelGCThreads, // mt discovery degree
|
||||
true, // atomic_discovery
|
||||
ParallelGCThreads, // mt processing degree
|
||||
true, // mt discovery
|
||||
ParallelGCThreads, // mt discovery degree
|
||||
true, // atomic_discovery
|
||||
&_is_alive_closure); // non-header is alive closure
|
||||
_counters = new CollectorCounters("PSParallelCompact", 1);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue