462 HeapWord* obj_addr = bottom() + BrooksPointer::word_size();
463 HeapWord* t = top();
464 // Could call objects iterate, but this is easier.
465 while (obj_addr < t) {
466 oop obj = oop(obj_addr);
467 obj_addr += obj->oop_iterate_size(blk) + BrooksPointer::word_size();
468 }
469 }
470
471 void ShenandoahHeapRegion::oop_iterate_humongous(ExtendedOopClosure* blk) {
472 assert(is_humongous(), "only humongous region here");
473 // Find head.
474 ShenandoahHeapRegion* r = humongous_start_region();
475 assert(r->is_humongous_start(), "need humongous head here");
476 oop obj = oop(r->bottom() + BrooksPointer::word_size());
477 obj->oop_iterate(blk, MemRegion(bottom(), top()));
478 }
479
480 void ShenandoahHeapRegion::fill_region() {
481 if (free() > (BrooksPointer::word_size() + CollectedHeap::min_fill_size())) {
482 HeapWord* filler = allocate(BrooksPointer::word_size(), ShenandoahHeap::_alloc_shared);
483 HeapWord* obj = allocate(end() - top(), ShenandoahHeap::_alloc_shared);
484 _heap->fill_with_object(obj, end() - obj);
485 BrooksPointer::initialize(oop(obj));
486 }
487 }
488
489 ShenandoahHeapRegion* ShenandoahHeapRegion::humongous_start_region() const {
490 assert(is_humongous(), "Must be a part of the humongous region");
491 size_t reg_num = region_number();
492 ShenandoahHeapRegion* r = const_cast<ShenandoahHeapRegion*>(this);
493 while (!r->is_humongous_start()) {
494 assert(reg_num > 0, "Sanity");
495 reg_num --;
496 r = _heap->get_region(reg_num);
497 assert(r->is_humongous(), "Must be a part of the humongous region");
498 }
499 assert(r->is_humongous_start(), "Must be");
500 return r;
501 }
502
503 void ShenandoahHeapRegion::recycle() {
504 ContiguousSpace::clear(false);
505 if (ZapUnusedHeapArea) {
|
462 HeapWord* obj_addr = bottom() + BrooksPointer::word_size();
463 HeapWord* t = top();
464 // Could call objects iterate, but this is easier.
465 while (obj_addr < t) {
466 oop obj = oop(obj_addr);
467 obj_addr += obj->oop_iterate_size(blk) + BrooksPointer::word_size();
468 }
469 }
470
471 void ShenandoahHeapRegion::oop_iterate_humongous(ExtendedOopClosure* blk) {
472 assert(is_humongous(), "only humongous region here");
473 // Find head.
474 ShenandoahHeapRegion* r = humongous_start_region();
475 assert(r->is_humongous_start(), "need humongous head here");
476 oop obj = oop(r->bottom() + BrooksPointer::word_size());
477 obj->oop_iterate(blk, MemRegion(bottom(), top()));
478 }
479
480 void ShenandoahHeapRegion::fill_region() {
481 if (free() > (BrooksPointer::word_size() + CollectedHeap::min_fill_size())) {
482 HeapWord* obj = allocate(end() - top(), ShenandoahHeap::_alloc_shared);
483 _heap->fill_with_object(obj, end() - obj);
484 }
485 }
486
487 ShenandoahHeapRegion* ShenandoahHeapRegion::humongous_start_region() const {
488 assert(is_humongous(), "Must be a part of the humongous region");
489 size_t reg_num = region_number();
490 ShenandoahHeapRegion* r = const_cast<ShenandoahHeapRegion*>(this);
491 while (!r->is_humongous_start()) {
492 assert(reg_num > 0, "Sanity");
493 reg_num --;
494 r = _heap->get_region(reg_num);
495 assert(r->is_humongous(), "Must be a part of the humongous region");
496 }
497 assert(r->is_humongous_start(), "Must be");
498 return r;
499 }
500
501 void ShenandoahHeapRegion::recycle() {
502 ContiguousSpace::clear(false);
503 if (ZapUnusedHeapArea) {
|