src/share/vm/gc_implementation/g1/heapRegion.cpp

changeset 3175
4dfb2df418f2
parent 3174
f0ecbe78fc7b
child 3179
811ec3d0833b
equal deleted inserted replaced
3174:f0ecbe78fc7b 3175:4dfb2df418f2
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),

mercurial