43 HeapRegion* hr, OopClosure* cl, |
43 HeapRegion* hr, OopClosure* cl, |
44 CardTableModRefBS::PrecisionStyle precision, |
44 CardTableModRefBS::PrecisionStyle precision, |
45 FilterKind fk) : |
45 FilterKind fk) : |
46 ContiguousSpaceDCTOC(hr, cl, precision, NULL), |
46 ContiguousSpaceDCTOC(hr, cl, precision, NULL), |
47 _hr(hr), _fk(fk), _g1(g1) |
47 _hr(hr), _fk(fk), _g1(g1) |
48 {} |
48 { } |
49 |
49 |
50 FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r, |
50 FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r, |
51 OopClosure* oc) : |
51 OopClosure* oc) : |
52 _r_bottom(r->bottom()), _r_end(r->end()), |
52 _r_bottom(r->bottom()), _r_end(r->end()), |
53 _oc(oc), _out_of_region(0) |
53 _oc(oc), _out_of_region(0) |
212 G1CollectedHeap* g1h = _g1; |
212 G1CollectedHeap* g1h = _g1; |
213 |
213 |
214 int oop_size; |
214 int oop_size; |
215 |
215 |
216 OopClosure* cl2 = cl; |
216 OopClosure* cl2 = cl; |
217 FilterIntoCSClosure intoCSFilt(this, g1h, cl); |
217 |
|
218 // If we are scanning the remembered sets looking for refs |
|
219 // into the collection set during an evacuation pause then |
|
220 // we will want to 'discover' reference objects that point |
|
221 // to referents in the collection set. |
|
222 // |
|
223 // Unfortunately it is an instance of FilterIntoCSClosure |
|
224 // that is iterated over the reference fields of oops in |
|
225 // mr (and not the G1ParPushHeapRSClosure - which is the |
|
226 // cl parameter). |
|
227 // If we set the _ref_processor field in the FilterIntoCSClosure |
|
228 // instance, all the reference objects that are walked |
|
229 // (regardless of whether their referent object's are in |
|
230 // the cset) will be 'discovered'. |
|
231 // |
|
232 // The G1STWIsAlive closure considers a referent object that |
|
233 // is outside the cset as alive. The G1CopyingKeepAliveClosure |
|
234 // skips referents that are not in the cset. |
|
235 // |
|
236 // Therefore reference objects in mr with a referent that is |
|
237 // outside the cset should be OK. |
|
238 |
|
239 ReferenceProcessor* rp = _cl->_ref_processor; |
|
240 if (rp != NULL) { |
|
241 assert(rp == _g1->ref_processor_stw(), "should be stw"); |
|
242 assert(_fk == IntoCSFilterKind, "should be looking for refs into CS"); |
|
243 } |
|
244 |
|
245 FilterIntoCSClosure intoCSFilt(this, g1h, cl, rp); |
218 FilterOutOfRegionClosure outOfRegionFilt(_hr, cl); |
246 FilterOutOfRegionClosure outOfRegionFilt(_hr, cl); |
|
247 |
219 switch (_fk) { |
248 switch (_fk) { |
220 case IntoCSFilterKind: cl2 = &intoCSFilt; break; |
249 case IntoCSFilterKind: cl2 = &intoCSFilt; break; |
221 case OutOfRegionFilterKind: cl2 = &outOfRegionFilt; break; |
250 case OutOfRegionFilterKind: cl2 = &outOfRegionFilt; break; |
222 } |
251 } |
223 |
252 |
237 // We replicate the loop below for several kinds of possible filters. |
266 // We replicate the loop below for several kinds of possible filters. |
238 switch (_fk) { |
267 switch (_fk) { |
239 case NoFilterKind: |
268 case NoFilterKind: |
240 bottom = walk_mem_region_loop(cl, g1h, _hr, bottom, top); |
269 bottom = walk_mem_region_loop(cl, g1h, _hr, bottom, top); |
241 break; |
270 break; |
|
271 |
242 case IntoCSFilterKind: { |
272 case IntoCSFilterKind: { |
243 FilterIntoCSClosure filt(this, g1h, cl); |
273 FilterIntoCSClosure filt(this, g1h, cl, rp); |
244 bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top); |
274 bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top); |
245 break; |
275 break; |
246 } |
276 } |
|
277 |
247 case OutOfRegionFilterKind: { |
278 case OutOfRegionFilterKind: { |
248 FilterOutOfRegionClosure filt(_hr, cl); |
279 FilterOutOfRegionClosure filt(_hr, cl); |
249 bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top); |
280 bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top); |
250 break; |
281 break; |
251 } |
282 } |
|
283 |
252 default: |
284 default: |
253 ShouldNotReachHere(); |
285 ShouldNotReachHere(); |
254 } |
286 } |
255 |
287 |
256 // Last object. Need to do dead-obj filtering here too. |
288 // Last object. Need to do dead-obj filtering here too. |
481 |
513 |
482 HeapRegion:: |
514 HeapRegion:: |
483 HeapRegion(size_t hrs_index, G1BlockOffsetSharedArray* sharedOffsetArray, |
515 HeapRegion(size_t hrs_index, G1BlockOffsetSharedArray* sharedOffsetArray, |
484 MemRegion mr, bool is_zeroed) |
516 MemRegion mr, bool is_zeroed) |
485 : G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed), |
517 : G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed), |
486 _next_fk(HeapRegionDCTOC::NoFilterKind), _hrs_index(hrs_index), |
518 _hrs_index(hrs_index), |
487 _humongous_type(NotHumongous), _humongous_start_region(NULL), |
519 _humongous_type(NotHumongous), _humongous_start_region(NULL), |
488 _in_collection_set(false), |
520 _in_collection_set(false), |
489 _next_in_special_set(NULL), _orig_end(NULL), |
521 _next_in_special_set(NULL), _orig_end(NULL), |
490 _claimed(InitialClaimValue), _evacuation_failed(false), |
522 _claimed(InitialClaimValue), _evacuation_failed(false), |
491 _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1), |
523 _prev_marked_bytes(0), _next_marked_bytes(0), _sort_index(-1), |