1266 AbstractGangTask("G1 Cleanup"),
1267 _g1h(g1h),
1268 _cleanup_list(cleanup_list),
1269 _hrclaimer(n_workers) {
1270
1271 HeapRegionRemSet::reset_for_cleanup_tasks();
1272 }
1273
1274 void work(uint worker_id) {
1275 FreeRegionList local_cleanup_list("Local Cleanup List");
1276 HRRSCleanupTask hrrs_cleanup_task;
1277 G1ReclaimEmptyRegionsClosure cl(_g1h,
1278 &local_cleanup_list,
1279 &hrrs_cleanup_task);
1280 _g1h->heap_region_par_iterate_from_worker_offset(&cl, &_hrclaimer, worker_id);
1281 assert(cl.is_complete(), "Shouldn't have aborted!");
1282
1283 // Now update the old/humongous region sets
1284 _g1h->remove_from_old_sets(cl.old_regions_removed(), cl.humongous_regions_removed());
1285 {
1286 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
1287 _g1h->decrement_summary_bytes(cl.freed_bytes());
1288
1289 _cleanup_list->add_ordered(&local_cleanup_list);
1290 assert(local_cleanup_list.is_empty(), "post-condition");
1291
1292 HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task);
1293 }
1294 }
1295 };
1296
1297 void G1ConcurrentMark::reclaim_empty_regions() {
1298 WorkGang* workers = _g1h->workers();
1299 FreeRegionList empty_regions_list("Empty Regions After Mark List");
1300
1301 G1ReclaimEmptyRegionsTask cl(_g1h, &empty_regions_list, workers->active_workers());
1302 workers->run_task(&cl);
1303
1304 if (!empty_regions_list.is_empty()) {
1305 log_debug(gc)("Reclaimed %u empty regions", empty_regions_list.length());
1306 // Now print the empty regions list.
|
1266 AbstractGangTask("G1 Cleanup"),
1267 _g1h(g1h),
1268 _cleanup_list(cleanup_list),
1269 _hrclaimer(n_workers) {
1270
1271 HeapRegionRemSet::reset_for_cleanup_tasks();
1272 }
1273
1274 void work(uint worker_id) {
1275 FreeRegionList local_cleanup_list("Local Cleanup List");
1276 HRRSCleanupTask hrrs_cleanup_task;
1277 G1ReclaimEmptyRegionsClosure cl(_g1h,
1278 &local_cleanup_list,
1279 &hrrs_cleanup_task);
1280 _g1h->heap_region_par_iterate_from_worker_offset(&cl, &_hrclaimer, worker_id);
1281 assert(cl.is_complete(), "Shouldn't have aborted!");
1282
1283 // Now update the old/humongous region sets
1284 _g1h->remove_from_old_sets(cl.old_regions_removed(), cl.humongous_regions_removed());
1285 {
1286 MutexLocker x(ParGCRareEvent_lock);
1287 _g1h->decrement_summary_bytes(cl.freed_bytes());
1288
1289 _cleanup_list->add_ordered(&local_cleanup_list);
1290 assert(local_cleanup_list.is_empty(), "post-condition");
1291
1292 HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task);
1293 }
1294 }
1295 };
1296
1297 void G1ConcurrentMark::reclaim_empty_regions() {
1298 WorkGang* workers = _g1h->workers();
1299 FreeRegionList empty_regions_list("Empty Regions After Mark List");
1300
1301 G1ReclaimEmptyRegionsTask cl(_g1h, &empty_regions_list, workers->active_workers());
1302 workers->run_task(&cl);
1303
1304 if (!empty_regions_list.is_empty()) {
1305 log_debug(gc)("Reclaimed %u empty regions", empty_regions_list.length());
1306 // Now print the empty regions list.
|