Print this page


Split Split Close
Expand all
Collapse all
          --- old/src/share/vm/gc/g1/heapRegion.cpp
          +++ new/src/share/vm/gc/g1/heapRegion.cpp
↓ open down ↓ 597 lines elided ↑ open up ↑
 598  598    if (in_collection_set())
 599  599      st->print(" CS");
 600  600    else
 601  601      st->print("   ");
 602  602    st->print(" TS %5d", _gc_time_stamp);
 603  603    st->print(" PTAMS " PTR_FORMAT " NTAMS " PTR_FORMAT,
 604  604              p2i(prev_top_at_mark_start()), p2i(next_top_at_mark_start()));
 605  605    G1OffsetTableContigSpace::print_on(st);
 606  606  }
 607  607  
 608      -class VerifyLiveClosure: public OopClosure {
 609      -private:
      608 +class HeapRegionVerifyClosure : public OopClosure {
      609 +protected:
 610  610    G1CollectedHeap* _g1h;
 611  611    CardTableModRefBS* _bs;
 612  612    oop _containing_obj;
 613  613    bool _failures;
 614  614    int _n_failures;
 615  615    VerifyOption _vo;
 616  616  public:
 617  617    // _vo == UsePrevMarking -> use "prev" marking information,
 618  618    // _vo == UseNextMarking -> use "next" marking information,
 619  619    // _vo == UseMarkWord    -> use mark word from object header.
 620      -  VerifyLiveClosure(G1CollectedHeap* g1h, VerifyOption vo) :
      620 +  HeapRegionVerifyClosure(G1CollectedHeap* g1h, VerifyOption vo) :
 621  621      _g1h(g1h), _bs(barrier_set_cast<CardTableModRefBS>(g1h->barrier_set())),
 622  622      _containing_obj(NULL), _failures(false), _n_failures(0), _vo(vo)
 623  623    { }
 624  624  
 625  625    void set_containing_obj(oop obj) {
 626  626      _containing_obj = obj;
 627  627    }
 628  628  
 629  629    bool failures() { return _failures; }
 630  630    int n_failures() { return _n_failures; }
 631  631  
 632      -  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 633      -  virtual void do_oop(      oop* p) { do_oop_work(p); }
 634      -
 635  632    void print_object(outputStream* out, oop obj) {
 636  633  #ifdef PRODUCT
 637  634      Klass* k = obj->klass();
 638  635      const char* class_name = k->external_name();
 639  636      out->print_cr("class name %s", class_name);
 640  637  #else // PRODUCT
 641  638      obj->print_on(out);
 642  639  #endif // PRODUCT
 643  640    }
 644  641  
 645  642    template <class T>
      643 +  void verifyRemSets(T* p) {
      644 +    T heap_oop = oopDesc::load_heap_oop(p);
      645 +    if (!oopDesc::is_null(heap_oop)) {
      646 +      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
      647 +      bool failed = false;
      648 +
      649 +      HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
      650 +      HeapRegion* to = _g1h->heap_region_containing(obj);
      651 +      if (from != NULL && to != NULL &&
      652 +        from != to &&
      653 +        !to->is_pinned()) {
      654 +        jbyte cv_obj = *_bs->byte_for_const(_containing_obj);
      655 +        jbyte cv_field = *_bs->byte_for_const(p);
      656 +        const jbyte dirty = CardTableModRefBS::dirty_card_val();
      657 +
      658 +        bool is_bad = !(from->is_young()
      659 +          || to->rem_set()->contains_reference(p)
      660 +          || !G1HRRSFlushLogBuffersOnVerify && // buffers were not flushed
      661 +          (_containing_obj->is_objArray() ?
      662 +          cv_field == dirty
      663 +          : cv_obj == dirty || cv_field == dirty));
      664 +        if (is_bad) {
      665 +          MutexLockerEx x(ParGCRareEvent_lock,
      666 +            Mutex::_no_safepoint_check_flag);
      667 +
      668 +          if (!_failures) {
      669 +            gclog_or_tty->cr();
      670 +            gclog_or_tty->print_cr("----------");
      671 +          }
      672 +          gclog_or_tty->print_cr("Missing rem set entry:");
      673 +          gclog_or_tty->print_cr("Field " PTR_FORMAT " "
      674 +            "of obj " PTR_FORMAT ", "
      675 +            "in region " HR_FORMAT,
      676 +            p2i(p), p2i(_containing_obj),
      677 +            HR_FORMAT_PARAMS(from));
      678 +          _containing_obj->print_on(gclog_or_tty);
      679 +          gclog_or_tty->print_cr("points to obj " PTR_FORMAT " "
      680 +            "in region " HR_FORMAT,
      681 +            p2i(obj),
      682 +            HR_FORMAT_PARAMS(to));
      683 +          obj->print_on(gclog_or_tty);
      684 +          gclog_or_tty->print_cr("Obj head CTE = %d, field CTE = %d.",
      685 +            cv_obj, cv_field);
      686 +          gclog_or_tty->print_cr("----------");
      687 +          gclog_or_tty->flush();
      688 +          _failures = true;
      689 +          if (!failed) _n_failures++;
      690 +        }
      691 +      }
      692 +    }
      693 +  }
      694 +};
      695 +
      696 +class VerifyRSetClosure : public HeapRegionVerifyClosure {
      697 +
      698 +public:
      699 +  VerifyRSetClosure(G1CollectedHeap* g1h, VerifyOption vo) : HeapRegionVerifyClosure(g1h, vo) { }
      700 +
      701 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
      702 +  virtual void do_oop(oop* p) { do_oop_work(p); }
      703 +
      704 +  template <class T>
 646  705    void do_oop_work(T* p) {
 647  706      assert(_containing_obj != NULL, "Precondition");
 648  707      assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
      708 +      "Precondition");
      709 +
      710 +    verifyRemSets(p);
      711 +  }
      712 +};
      713 +
      714 +class VerifyLiveClosure : public HeapRegionVerifyClosure {
      715 +public:
      716 +  VerifyLiveClosure(G1CollectedHeap* g1h, VerifyOption vo) : HeapRegionVerifyClosure(g1h, vo) { }
      717 +
      718 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
      719 +  virtual void do_oop(      oop* p) { do_oop_work(p); }
      720 +
      721 +  template <class T>
      722 +  void do_oop_work(T* p) {
      723 +    assert(_containing_obj != NULL, "Precondition");
      724 +    assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
 649  725             "Precondition");
 650  726      T heap_oop = oopDesc::load_heap_oop(p);
 651  727      if (!oopDesc::is_null(heap_oop)) {
 652  728        oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
 653  729        bool failed = false;
 654  730        if (!_g1h->is_in_closed_subset(obj) || _g1h->is_obj_dead_cond(obj, _vo)) {
 655  731          MutexLockerEx x(ParGCRareEvent_lock,
 656  732                          Mutex::_no_safepoint_check_flag);
 657  733  
 658  734          if (!_failures) {
↓ open down ↓ 25 lines elided ↑ open up ↑
 684  760            print_object(gclog_or_tty, obj);
 685  761          }
 686  762          gclog_or_tty->print_cr("----------");
 687  763          gclog_or_tty->flush();
 688  764          _failures = true;
 689  765          failed = true;
 690  766          _n_failures++;
 691  767        }
 692  768  
 693  769        if (!_g1h->collector_state()->full_collection() || G1VerifyRSetsDuringFullGC) {
 694      -        HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
 695      -        HeapRegion* to   = _g1h->heap_region_containing(obj);
 696      -        if (from != NULL && to != NULL &&
 697      -            from != to &&
 698      -            !to->is_pinned()) {
 699      -          jbyte cv_obj = *_bs->byte_for_const(_containing_obj);
 700      -          jbyte cv_field = *_bs->byte_for_const(p);
 701      -          const jbyte dirty = CardTableModRefBS::dirty_card_val();
 702      -
 703      -          bool is_bad = !(from->is_young()
 704      -                          || to->rem_set()->contains_reference(p)
 705      -                          || !G1HRRSFlushLogBuffersOnVerify && // buffers were not flushed
 706      -                              (_containing_obj->is_objArray() ?
 707      -                                  cv_field == dirty
 708      -                               : cv_obj == dirty || cv_field == dirty));
 709      -          if (is_bad) {
 710      -            MutexLockerEx x(ParGCRareEvent_lock,
 711      -                            Mutex::_no_safepoint_check_flag);
 712      -
 713      -            if (!_failures) {
 714      -              gclog_or_tty->cr();
 715      -              gclog_or_tty->print_cr("----------");
 716      -            }
 717      -            gclog_or_tty->print_cr("Missing rem set entry:");
 718      -            gclog_or_tty->print_cr("Field " PTR_FORMAT " "
 719      -                                   "of obj " PTR_FORMAT ", "
 720      -                                   "in region " HR_FORMAT,
 721      -                                   p2i(p), p2i(_containing_obj),
 722      -                                   HR_FORMAT_PARAMS(from));
 723      -            _containing_obj->print_on(gclog_or_tty);
 724      -            gclog_or_tty->print_cr("points to obj " PTR_FORMAT " "
 725      -                                   "in region " HR_FORMAT,
 726      -                                   p2i(obj),
 727      -                                   HR_FORMAT_PARAMS(to));
 728      -            obj->print_on(gclog_or_tty);
 729      -            gclog_or_tty->print_cr("Obj head CTE = %d, field CTE = %d.",
 730      -                          cv_obj, cv_field);
 731      -            gclog_or_tty->print_cr("----------");
 732      -            gclog_or_tty->flush();
 733      -            _failures = true;
 734      -            if (!failed) _n_failures++;
 735      -          }
 736      -        }
      770 +        verifyRemSets(p);
 737  771        }
 738  772      }
 739  773    }
 740  774  };
 741  775  
 742  776  // This really ought to be commoned up into OffsetTableContigSpace somehow.
 743  777  // We would need a mechanism to make that code skip dead objects.
 744  778  
 745  779  void HeapRegion::verify(VerifyOption vo,
 746  780                          bool* failures) const {
↓ open down ↓ 120 lines elided ↑ open up ↑
 867  901    }
 868  902  
 869  903    verify_strong_code_roots(vo, failures);
 870  904  }
 871  905  
 872  906  void HeapRegion::verify() const {
 873  907    bool dummy = false;
 874  908    verify(VerifyOption_G1UsePrevMarking, /* failures */ &dummy);
 875  909  }
 876  910  
      911 +void HeapRegion::verifyRSet(VerifyOption vo,
      912 +  bool* failures) const {
      913 +  G1CollectedHeap* g1 = G1CollectedHeap::heap();
      914 +  *failures = false;
      915 +  HeapWord* p = bottom();
      916 +  HeapWord* prev_p = NULL;
      917 +  VerifyRSetClosure v_rset_cl(g1, vo);
      918 +  bool is_region_humongous = is_humongous();
      919 +  while (p < top()) {
      920 +    oop obj = oop(p);
      921 +    size_t obj_size = block_size(p);
      922 +
      923 +    if (!g1->is_obj_dead_cond(obj, this, vo)) {
      924 +      if (obj->is_oop()) {
      925 +        v_rset_cl.set_containing_obj(obj);
      926 +        obj->oop_iterate_no_header(&v_rset_cl);
      927 +        if (v_rset_cl.failures()) {
      928 +          *failures = true;
      929 +        }
      930 +        if (G1MaxVerifyFailures >= 0 &&
      931 +          v_rset_cl.n_failures() >= G1MaxVerifyFailures) {
      932 +          return;
      933 +        }
      934 +      }
      935 +      else {
      936 +        gclog_or_tty->print_cr(PTR_FORMAT " not an oop", p2i(obj));
      937 +        *failures = true;
      938 +        return;
      939 +      }
      940 +    }
      941 +    prev_p = p;
      942 +    p += obj_size;
      943 +  }
      944 +}
      945 +
 877  946  void HeapRegion::prepare_for_compaction(CompactPoint* cp) {
 878  947    scan_and_forward(this, cp);
 879  948  }
 880  949  
 881  950  // G1OffsetTableContigSpace code; copied from space.cpp.  Hope this can go
 882  951  // away eventually.
 883  952  
 884  953  void G1OffsetTableContigSpace::clear(bool mangle_space) {
 885  954    set_top(bottom());
 886  955    _scan_top = bottom();
↓ open down ↓ 110 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX