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

changeset 3296
dc467e8b2c5e
parent 3294
bca17e38de00
child 3357
441e946dc1af
equal deleted inserted replaced
3295:00dd86e542eb 3296:dc467e8b2c5e
207 } 207 }
208 size_t cards_done() { return _cards_done;} 208 size_t cards_done() { return _cards_done;}
209 size_t cards_looked_up() { return _cards;} 209 size_t cards_looked_up() { return _cards;}
210 }; 210 };
211 211
212 // We want the parallel threads to start their scanning at
213 // different collection set regions to avoid contention.
214 // If we have:
215 // n collection set regions
216 // p threads
217 // Then thread t will start at region t * floor (n/p)
218
219 HeapRegion* G1RemSet::calculateStartRegion(int worker_i) {
220 HeapRegion* result = _g1p->collection_set();
221 if (G1CollectedHeap::use_parallel_gc_threads()) {
222 size_t cs_size = _g1p->cset_region_length();
223 int n_workers = _g1->workers()->total_workers();
224 size_t cs_spans = cs_size / n_workers;
225 size_t ind = cs_spans * worker_i;
226 for (size_t i = 0; i < ind; i++)
227 result = result->next_in_collection_set();
228 }
229 return result;
230 }
231
232 void G1RemSet::scanRS(OopsInHeapRegionClosure* oc, int worker_i) { 212 void G1RemSet::scanRS(OopsInHeapRegionClosure* oc, int worker_i) {
233 double rs_time_start = os::elapsedTime(); 213 double rs_time_start = os::elapsedTime();
234 HeapRegion *startRegion = calculateStartRegion(worker_i); 214 HeapRegion *startRegion = _g1->start_cset_region_for_worker(worker_i);
235 215
236 ScanRSClosure scanRScl(oc, worker_i); 216 ScanRSClosure scanRScl(oc, worker_i);
237 217
238 _g1->collection_set_iterate_from(startRegion, &scanRScl); 218 _g1->collection_set_iterate_from(startRegion, &scanRScl);
239 scanRScl.set_try_claimed(); 219 scanRScl.set_try_claimed();

mercurial