485 GCTraceTime(Info, gc, phases) time("Phase 2: Compute new object addresses", _gc_timer);
486 ShenandoahHeap* heap = ShenandoahHeap::heap();
487
488 ShenandoahMCReclaimHumongousRegionClosure cl;
489 heap->heap_region_iterate(&cl);
490
491 // Initialize copy queues.
492 for (uint i = 0; i < heap->max_workers(); i++) {
493 copy_queues[i] = new ShenandoahHeapRegionSet(heap->max_regions());
494 }
495
496 ShenandoahHeapRegionSet* from_regions = heap->regions();
497 from_regions->clear_current_index();
498 ShenandoahPrepareForCompactionTask prepare_task(from_regions, copy_queues);
499 heap->workers()->run_task(&prepare_task);
500 }
501
502 class ShenandoahAdjustPointersClosure : public MetadataAwareOopClosure {
503 private:
504 ShenandoahHeap* _heap;
505 public:
506
507 ShenandoahAdjustPointersClosure() : _heap(ShenandoahHeap::heap()) {
508 }
509
510 private:
511 template <class T>
512 inline void do_oop_work(T* p) {
513 T o = oopDesc::load_heap_oop(p);
514 if (! oopDesc::is_null(o)) {
515 oop obj = oopDesc::decode_heap_oop_not_null(o);
516 assert(_heap->is_marked_complete(obj), "must be marked");
517 oop forw = oop(BrooksPointer::get_raw(obj));
518 oopDesc::encode_store_heap_oop(p, forw);
519 if (UseShenandoahMatrix) {
520 if (_heap->is_in_reserved(p)) {
521 assert(_heap->is_in_reserved(forw), "must be in heap");
522 _heap->connection_matrix()->set_connected(p, forw);
523 }
524 }
525 }
526 }
527 public:
528 void do_oop(oop* p) {
529 do_oop_work(p);
530 }
531 void do_oop(narrowOop* p) {
532 do_oop_work(p);
533 }
534 };
535
536 class ShenandoahAdjustPointersObjectClosure : public ObjectClosure {
537 private:
538 ShenandoahAdjustPointersClosure _cl;
539 ShenandoahHeap* _heap;
540 public:
541 ShenandoahAdjustPointersObjectClosure() :
542 _heap(ShenandoahHeap::heap()) {
543 }
544 void do_object(oop p) {
545 assert(_heap->is_marked_complete(p), "must be marked");
546 oop forw = oop(BrooksPointer::get_raw(p));
547 uint from_idx = _heap->heap_region_index_containing(forw);
548 p->oop_iterate(&_cl);
549 }
550 };
551
552 class ShenandoahAdjustPointersTask : public AbstractGangTask {
553 private:
554 ShenandoahHeapRegionSet* _regions;
555 public:
556
557 ShenandoahAdjustPointersTask(ShenandoahHeapRegionSet* regions) :
558 AbstractGangTask("Shenandoah Adjust Pointers Task"),
559 _regions(regions) {
560 }
561
562 void work(uint worker_id) {
563 ShenandoahHeap* heap = ShenandoahHeap::heap();
564 ShenandoahHeapRegion* r = _regions->claim_next();
565 ShenandoahAdjustPointersObjectClosure obj_cl;
566 while (r != NULL) {
567 if (! r->is_humongous_continuation()) {
|
485 GCTraceTime(Info, gc, phases) time("Phase 2: Compute new object addresses", _gc_timer);
486 ShenandoahHeap* heap = ShenandoahHeap::heap();
487
488 ShenandoahMCReclaimHumongousRegionClosure cl;
489 heap->heap_region_iterate(&cl);
490
491 // Initialize copy queues.
492 for (uint i = 0; i < heap->max_workers(); i++) {
493 copy_queues[i] = new ShenandoahHeapRegionSet(heap->max_regions());
494 }
495
496 ShenandoahHeapRegionSet* from_regions = heap->regions();
497 from_regions->clear_current_index();
498 ShenandoahPrepareForCompactionTask prepare_task(from_regions, copy_queues);
499 heap->workers()->run_task(&prepare_task);
500 }
501
502 class ShenandoahAdjustPointersClosure : public MetadataAwareOopClosure {
503 private:
504 ShenandoahHeap* _heap;
505 int _new_obj_offset;
506 public:
507
508 ShenandoahAdjustPointersClosure() : _heap(ShenandoahHeap::heap()) {
509 }
510
511 private:
512 template <class T>
513 inline void do_oop_work(T* p) {
514 T o = oopDesc::load_heap_oop(p);
515 if (! oopDesc::is_null(o)) {
516 oop obj = oopDesc::decode_heap_oop_not_null(o);
517 assert(_heap->is_marked_complete(obj), "must be marked");
518 oop forw = oop(BrooksPointer::get_raw(obj));
519 oopDesc::encode_store_heap_oop(p, forw);
520 if (UseShenandoahMatrix) {
521 if (_heap->is_in_reserved(p)) {
522 assert(_heap->is_in_reserved(forw), "must be in heap");
523 _heap->connection_matrix()->set_connected(((HeapWord*) p) - _new_obj_offset, forw);
524 }
525 }
526 }
527 }
528 public:
529 void do_oop(oop* p) {
530 do_oop_work(p);
531 }
532 void do_oop(narrowOop* p) {
533 do_oop_work(p);
534 }
535 void set_new_obj_offset(int new_obj_offset) {
536 _new_obj_offset = new_obj_offset;
537 }
538 };
539
540 class ShenandoahAdjustPointersObjectClosure : public ObjectClosure {
541 private:
542 ShenandoahAdjustPointersClosure _cl;
543 ShenandoahHeap* _heap;
544 public:
545 ShenandoahAdjustPointersObjectClosure() :
546 _heap(ShenandoahHeap::heap()) {
547 }
548 void do_object(oop p) {
549 assert(_heap->is_marked_complete(p), "must be marked");
550 HeapWord* forw = oop(BrooksPointer::get_raw(p));
551 _cl.set_new_obj_offset(((HeapWord*) p) - forw);
552 p->oop_iterate(&_cl);
553 }
554 };
555
556 class ShenandoahAdjustPointersTask : public AbstractGangTask {
557 private:
558 ShenandoahHeapRegionSet* _regions;
559 public:
560
561 ShenandoahAdjustPointersTask(ShenandoahHeapRegionSet* regions) :
562 AbstractGangTask("Shenandoah Adjust Pointers Task"),
563 _regions(regions) {
564 }
565
566 void work(uint worker_id) {
567 ShenandoahHeap* heap = ShenandoahHeap::heap();
568 ShenandoahHeapRegion* r = _regions->claim_next();
569 ShenandoahAdjustPointersObjectClosure obj_cl;
570 while (r != NULL) {
571 if (! r->is_humongous_continuation()) {
|