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::space_iterate(SpaceClosure* cl) { 2507 SpaceClosureRegionClosure blk(cl); 2508 heap_region_iterate(&blk); 2509 } 2510 2511 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const { 2512 _hrm.iterate(cl); 2513 } 2514 2515 void 2516 G1CollectedHeap::heap_region_par_iterate(HeapRegionClosure* cl, 2517 uint worker_id, 2518 HeapRegionClaimer *hrclaimer, 2519 bool concurrent) const { 2520 _hrm.par_iterate(cl, worker_id, hrclaimer, concurrent); 2521 } 2522 2523 // Clear the cached CSet starting regions and (more importantly) 2524 // the time stamps. Called when we reset the GC time stamp. 2525 void G1CollectedHeap::clear_cset_start_regions() { 2526 assert(_worker_cset_start_region != NULL, "sanity"); 2527 assert(_worker_cset_start_region_time_stamp != NULL, "sanity"); 2528 2529 int n_queues = MAX2((int)ParallelGCThreads, 1); 2530 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++) { |