2474 2475 // Iterates an ObjectClosure over all objects within a HeapRegion. 2476 2477 class IterateObjectClosureRegionClosure: public HeapRegionClosure { 2478 ObjectClosure* _cl; 2479 public: 2480 IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {} 2481 bool doHeapRegion(HeapRegion* r) { 2482 if (!r->is_continues_humongous()) { 2483 r->object_iterate(_cl); 2484 } 2485 return false; 2486 } 2487 }; 2488 2489 void G1CollectedHeap::object_iterate(ObjectClosure* cl) { 2490 IterateObjectClosureRegionClosure blk(cl); 2491 heap_region_iterate(&blk); 2492 } 2493 2494 // Calls a SpaceClosure on a HeapRegion. 2495 2496 class SpaceClosureRegionClosure: public HeapRegionClosure { 2497 SpaceClosure* _cl; 2498 public: 2499 SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {} 2500 bool doHeapRegion(HeapRegion* r) { 2501 _cl->do_space(r); 2502 return false; 2503 } 2504 }; 2505 2506 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const { 2507 _hrm.iterate(cl); 2508 } 2509 2510 void 2511 G1CollectedHeap::heap_region_par_iterate(HeapRegionClosure* cl, 2512 uint worker_id, 2513 HeapRegionClaimer *hrclaimer, 2514 bool concurrent) const { 2515 _hrm.par_iterate(cl, worker_id, hrclaimer, concurrent); 2516 } 2517 2518 // Clear the cached CSet starting regions and (more importantly) 2519 // the time stamps. Called when we reset the GC time stamp. 2520 void G1CollectedHeap::clear_cset_start_regions() { 2521 assert(_worker_cset_start_region != NULL, "sanity"); 2522 assert(_worker_cset_start_region_time_stamp != NULL, "sanity"); 2523 2524 int n_queues = MAX2((int)ParallelGCThreads, 1); 2525 for (int i = 0; i < n_queues; i++) { | 2474 2475 // Iterates an ObjectClosure over all objects within a HeapRegion. 2476 2477 class IterateObjectClosureRegionClosure: public HeapRegionClosure { 2478 ObjectClosure* _cl; 2479 public: 2480 IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {} 2481 bool doHeapRegion(HeapRegion* r) { 2482 if (!r->is_continues_humongous()) { 2483 r->object_iterate(_cl); 2484 } 2485 return false; 2486 } 2487 }; 2488 2489 void G1CollectedHeap::object_iterate(ObjectClosure* cl) { 2490 IterateObjectClosureRegionClosure blk(cl); 2491 heap_region_iterate(&blk); 2492 } 2493 2494 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const { 2495 _hrm.iterate(cl); 2496 } 2497 2498 void 2499 G1CollectedHeap::heap_region_par_iterate(HeapRegionClosure* cl, 2500 uint worker_id, 2501 HeapRegionClaimer *hrclaimer, 2502 bool concurrent) const { 2503 _hrm.par_iterate(cl, worker_id, hrclaimer, concurrent); 2504 } 2505 2506 // Clear the cached CSet starting regions and (more importantly) 2507 // the time stamps. Called when we reset the GC time stamp. 2508 void G1CollectedHeap::clear_cset_start_regions() { 2509 assert(_worker_cset_start_region != NULL, "sanity"); 2510 assert(_worker_cset_start_region_time_stamp != NULL, "sanity"); 2511 2512 int n_queues = MAX2((int)ParallelGCThreads, 1); 2513 for (int i = 0; i < n_queues; i++) { |