< prev index next >

src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp

Print this page
rev 13086 : [mq]: partial-fixfullgc.patch


 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()) {


< prev index next >