Пример #1
0
  void process_buffer () {

    assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer),
           "the two lengths should be the same");

    double start = os::elapsedTime();
    HeapRegion** hr_curr = _hr_buffer;
    HeapRegion*  hr_prev = NULL;
    for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
      HeapRegion* region = *hr_curr;
      if (region != hr_prev) {
        _oc->set_region(region);
        hr_prev = region;
      }
      if (curr->is_narrow()) {
        assert(UseCompressedOops, "Error");
        _oc->do_oop((narrowOop*)(*curr));
      } else {
        _oc->do_oop((oop*)(*curr));
      }
      ++hr_curr;
    }
    _buffer_curr = _buffer;
    _hr_curr = _hr_buffer;
    _closure_app_seconds += (os::elapsedTime() - start);
  }
Пример #2
0
  void scanCard(size_t index, HeapRegion *r) {
    _cards_done++;
    DirtyCardToOopClosure* cl =
      r->new_dcto_closure(_oc,
                         CardTableModRefBS::Precise,
                         HeapRegionDCTOC::IntoCSFilterKind);

    // Set the "from" region in the closure.
    _oc->set_region(r);
    HeapWord* card_start = _bot_shared->address_for_index(index);
    HeapWord* card_end = card_start + G1BlockOffsetSharedArray::N_words;
    Space *sp = SharedHeap::heap()->space_containing(card_start);
    MemRegion sm_region;
    if (ParallelGCThreads > 0) {
      // first find the used area
      sm_region = sp->used_region_at_save_marks();
    } else {
      // The closure is not idempotent.  We shouldn't look at objects
      // allocated during the GC.
      sm_region = sp->used_region_at_save_marks();
    }
    MemRegion mr = sm_region.intersection(MemRegion(card_start,card_end));
    if (!mr.is_empty()) {
      cl->do_MemRegion(mr);
    }
  }
Пример #3
0
  void process_buffer () {

    assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer),
           "the two lengths should be the same");

    double start = os::elapsedTime();
    HeapRegion **hr_curr = _hr_buffer;
    HeapRegion *hr_prev = NULL;
    for (oop **curr = _buffer; curr < _buffer_curr; ++curr) {
      HeapRegion *region = *hr_curr;
      if (region != hr_prev) {
        _oc->set_region(region);
        hr_prev = region;
      }
      _oc->do_oop(*curr);
      ++hr_curr;
    }
    _buffer_curr = _buffer;
    _hr_curr = _hr_buffer;
    _closure_app_seconds += (os::elapsedTime() - start);
  }
Пример #4
0
 template <class T> void do_oop_work(T* p) {
   oop obj = oopDesc::load_decode_heap_oop(p);
   if (_g1->obj_in_cs(obj)) _blk->do_oop(p);
 }
Пример #5
0
 void set_region(HeapRegion* from) {
   _blk->set_region(from);
 }