1334 // into heap dumper.
1335 ShenandoahHeapIterationRootScanner rp;
1336 rp.roots_do(&oops);
1337 }
1338
1339 // Work through the oop stack to traverse heap.
1340 while (! oop_stack.is_empty()) {
1341 oop obj = oop_stack.pop();
1342 assert(oopDesc::is_oop(obj), "must be a valid oop");
1343 cl->do_object(obj);
1344 obj->oop_iterate(&oops);
1345 }
1346
1347 assert(oop_stack.is_empty(), "should be empty");
1348
1349 if (!_aux_bitmap_region_special && !os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) {
1350 log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration");
1351 }
1352 }
1353
1354 // Keep alive an object that was loaded with AS_NO_KEEPALIVE.
1355 void ShenandoahHeap::keep_alive(oop obj) {
1356 if (is_concurrent_mark_in_progress()) {
1357 ShenandoahBarrierSet::barrier_set()->enqueue(obj);
1358 }
1359 }
1360
1361 void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const {
1362 for (size_t i = 0; i < num_regions(); i++) {
1363 ShenandoahHeapRegion* current = get_region(i);
1364 blk->heap_region_do(current);
1365 }
1366 }
1367
1368 class ShenandoahParallelHeapRegionTask : public AbstractGangTask {
1369 private:
1370 ShenandoahHeap* const _heap;
1371 ShenandoahHeapRegionClosure* const _blk;
1372
1373 shenandoah_padding(0);
|
1334 // into heap dumper.
1335 ShenandoahHeapIterationRootScanner rp;
1336 rp.roots_do(&oops);
1337 }
1338
1339 // Work through the oop stack to traverse heap.
1340 while (! oop_stack.is_empty()) {
1341 oop obj = oop_stack.pop();
1342 assert(oopDesc::is_oop(obj), "must be a valid oop");
1343 cl->do_object(obj);
1344 obj->oop_iterate(&oops);
1345 }
1346
1347 assert(oop_stack.is_empty(), "should be empty");
1348
1349 if (!_aux_bitmap_region_special && !os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) {
1350 log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration");
1351 }
1352 }
1353
1354 void ShenandoahHeap::run_task(AbstractGangTask* task) {
1355 workers()->run_task(task, workers()->active_workers());
1356 }
1357
1358 // Keep alive an object that was loaded with AS_NO_KEEPALIVE.
1359 void ShenandoahHeap::keep_alive(oop obj) {
1360 if (is_concurrent_mark_in_progress()) {
1361 ShenandoahBarrierSet::barrier_set()->enqueue(obj);
1362 }
1363 }
1364
1365 void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const {
1366 for (size_t i = 0; i < num_regions(); i++) {
1367 ShenandoahHeapRegion* current = get_region(i);
1368 blk->heap_region_do(current);
1369 }
1370 }
1371
1372 class ShenandoahParallelHeapRegionTask : public AbstractGangTask {
1373 private:
1374 ShenandoahHeap* const _heap;
1375 ShenandoahHeapRegionClosure* const _blk;
1376
1377 shenandoah_padding(0);
|