src/share/vm/gc_implementation/g1/concurrentMark.cpp

changeset 1280
df6caf649ff7
parent 1266
3eb9872b10ce
child 1301
18f526145aea
     1.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Fri Jul 10 16:01:20 2009 -0700
     1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Tue Jul 14 15:40:39 2009 -0700
     1.3 @@ -452,13 +452,10 @@
     1.4    _regionStack.allocate(G1MarkRegionStackSize);
     1.5  
     1.6    // Create & start a ConcurrentMark thread.
     1.7 -  if (G1ConcMark) {
     1.8 -    _cmThread = new ConcurrentMarkThread(this);
     1.9 -    assert(cmThread() != NULL, "CM Thread should have been created");
    1.10 -    assert(cmThread()->cm() != NULL, "CM Thread should refer to this cm");
    1.11 -  } else {
    1.12 -    _cmThread = NULL;
    1.13 -  }
    1.14 +  _cmThread = new ConcurrentMarkThread(this);
    1.15 +  assert(cmThread() != NULL, "CM Thread should have been created");
    1.16 +  assert(cmThread()->cm() != NULL, "CM Thread should refer to this cm");
    1.17 +
    1.18    _g1h = G1CollectedHeap::heap();
    1.19    assert(CGC_lock != NULL, "Where's the CGC_lock?");
    1.20    assert(_markBitMap1.covers(rs), "_markBitMap1 inconsistency");
    1.21 @@ -783,18 +780,18 @@
    1.22                       bool do_barrier) : _cm(cm), _g1h(g1h),
    1.23                                          _do_barrier(do_barrier) { }
    1.24  
    1.25 -  virtual void do_oop(narrowOop* p) {
    1.26 -    guarantee(false, "NYI");
    1.27 -  }
    1.28 -
    1.29 -  virtual void do_oop(oop* p) {
    1.30 -    oop thisOop = *p;
    1.31 -    if (thisOop != NULL) {
    1.32 -      assert(thisOop->is_oop() || thisOop->mark() == NULL,
    1.33 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    1.34 +  virtual void do_oop(      oop* p) { do_oop_work(p); }
    1.35 +
    1.36 +  template <class T> void do_oop_work(T* p) {
    1.37 +    T heap_oop = oopDesc::load_heap_oop(p);
    1.38 +    if (!oopDesc::is_null(heap_oop)) {
    1.39 +      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    1.40 +      assert(obj->is_oop() || obj->mark() == NULL,
    1.41               "expected an oop, possibly with mark word displaced");
    1.42 -      HeapWord* addr = (HeapWord*)thisOop;
    1.43 +      HeapWord* addr = (HeapWord*)obj;
    1.44        if (_g1h->is_in_g1_reserved(addr)) {
    1.45 -        _cm->grayRoot(thisOop);
    1.46 +        _cm->grayRoot(obj);
    1.47        }
    1.48      }
    1.49      if (_do_barrier) {
    1.50 @@ -850,16 +847,6 @@
    1.51    double start = os::elapsedTime();
    1.52    GCOverheadReporter::recordSTWStart(start);
    1.53  
    1.54 -  // If there has not been a GC[n-1] since last GC[n] cycle completed,
    1.55 -  // precede our marking with a collection of all
    1.56 -  // younger generations to keep floating garbage to a minimum.
    1.57 -  // YSR: we won't do this for now -- it's an optimization to be
    1.58 -  // done post-beta.
    1.59 -
    1.60 -  // YSR:    ignoring weak refs for now; will do at bug fixing stage
    1.61 -  // EVM:    assert(discoveredRefsAreClear());
    1.62 -
    1.63 -
    1.64    G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
    1.65    g1p->record_concurrent_mark_init_start();
    1.66    checkpointRootsInitialPre();
    1.67 @@ -1135,6 +1122,13 @@
    1.68      return;
    1.69    }
    1.70  
    1.71 +  if (VerifyDuringGC) {
    1.72 +    HandleMark hm;  // handle scope
    1.73 +    gclog_or_tty->print(" VerifyDuringGC:(before)");
    1.74 +    Universe::heap()->prepare_for_verify();
    1.75 +    Universe::verify(true, false, true);
    1.76 +  }
    1.77 +
    1.78    G1CollectorPolicy* g1p = g1h->g1_policy();
    1.79    g1p->record_concurrent_mark_remark_start();
    1.80  
    1.81 @@ -1159,10 +1153,12 @@
    1.82      JavaThread::satb_mark_queue_set().set_active_all_threads(false);
    1.83  
    1.84      if (VerifyDuringGC) {
    1.85 -      g1h->prepare_for_verify();
    1.86 -      g1h->verify(/* allow_dirty */      true,
    1.87 -                  /* silent */           false,
    1.88 -                  /* use_prev_marking */ false);
    1.89 +      HandleMark hm;  // handle scope
    1.90 +      gclog_or_tty->print(" VerifyDuringGC:(after)");
    1.91 +      Universe::heap()->prepare_for_verify();
    1.92 +      Universe::heap()->verify(/* allow_dirty */      true,
    1.93 +                               /* silent */           false,
    1.94 +                               /* use_prev_marking */ false);
    1.95      }
    1.96    }
    1.97  
    1.98 @@ -1658,6 +1654,15 @@
    1.99      return;
   1.100    }
   1.101  
   1.102 +  if (VerifyDuringGC) {
   1.103 +    HandleMark hm;  // handle scope
   1.104 +    gclog_or_tty->print(" VerifyDuringGC:(before)");
   1.105 +    Universe::heap()->prepare_for_verify();
   1.106 +    Universe::verify(/* allow dirty  */ true,
   1.107 +                     /* silent       */ false,
   1.108 +                     /* prev marking */ true);
   1.109 +  }
   1.110 +
   1.111    _cleanup_co_tracker.disable();
   1.112  
   1.113    G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
   1.114 @@ -1790,10 +1795,12 @@
   1.115    g1h->increment_total_collections();
   1.116  
   1.117    if (VerifyDuringGC) {
   1.118 -    g1h->prepare_for_verify();
   1.119 -    g1h->verify(/* allow_dirty */      true,
   1.120 -                /* silent */           false,
   1.121 -                /* use_prev_marking */ true);
   1.122 +    HandleMark hm;  // handle scope
   1.123 +    gclog_or_tty->print(" VerifyDuringGC:(after)");
   1.124 +    Universe::heap()->prepare_for_verify();
   1.125 +    Universe::verify(/* allow dirty  */ true,
   1.126 +                     /* silent       */ false,
   1.127 +                     /* prev marking */ true);
   1.128    }
   1.129  }
   1.130  
   1.131 @@ -1852,12 +1859,11 @@
   1.132      _g1(g1), _cm(cm),
   1.133      _bitMap(bitMap) {}
   1.134  
   1.135 -  void do_oop(narrowOop* p) {
   1.136 -    guarantee(false, "NYI");
   1.137 -  }
   1.138 -
   1.139 -  void do_oop(oop* p) {
   1.140 -    oop thisOop = *p;
   1.141 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
   1.142 +  virtual void do_oop(      oop* p) { do_oop_work(p); }
   1.143 +
   1.144 +  template <class T> void do_oop_work(T* p) {
   1.145 +    oop thisOop = oopDesc::load_decode_heap_oop(p);
   1.146      HeapWord* addr = (HeapWord*)thisOop;
   1.147      if (_g1->is_in_g1_reserved(addr) && _g1->is_obj_ill(thisOop)) {
   1.148        _bitMap->mark(addr);
   1.149 @@ -2016,12 +2022,11 @@
   1.150    ReachablePrinterOopClosure(CMBitMapRO* bitmap, outputStream* out) :
   1.151      _bitmap(bitmap), _g1h(G1CollectedHeap::heap()), _out(out) { }
   1.152  
   1.153 -  void do_oop(narrowOop* p) {
   1.154 -    guarantee(false, "NYI");
   1.155 -  }
   1.156 -
   1.157 -  void do_oop(oop* p) {
   1.158 -    oop         obj = *p;
   1.159 +  void do_oop(narrowOop* p) { do_oop_work(p); }
   1.160 +  void do_oop(      oop* p) { do_oop_work(p); }
   1.161 +
   1.162 +  template <class T> void do_oop_work(T* p) {
   1.163 +    oop         obj = oopDesc::load_decode_heap_oop(p);
   1.164      const char* str = NULL;
   1.165      const char* str2 = "";
   1.166  
   1.167 @@ -2163,6 +2168,7 @@
   1.168  
   1.169  
   1.170    HeapWord* objAddr = (HeapWord*) obj;
   1.171 +  assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
   1.172    if (_g1h->is_in_g1_reserved(objAddr)) {
   1.173      tmp_guarantee_CM( obj != NULL, "is_in_g1_reserved should ensure this" );
   1.174      HeapRegion* hr = _g1h->heap_region_containing(obj);
   1.175 @@ -2380,7 +2386,7 @@
   1.176      }
   1.177    }
   1.178  
   1.179 -  bool drain() {
   1.180 +  template <class T> bool drain() {
   1.181      while (_ms_ind > 0) {
   1.182        oop obj = pop();
   1.183        assert(obj != NULL, "Since index was non-zero.");
   1.184 @@ -2394,9 +2400,8 @@
   1.185          }
   1.186          // Now process this portion of this one.
   1.187          int lim = MIN2(next_arr_ind, len);
   1.188 -        assert(!UseCompressedOops, "This needs to be fixed");
   1.189          for (int j = arr_ind; j < lim; j++) {
   1.190 -          do_oop(aobj->obj_at_addr<oop>(j));
   1.191 +          do_oop(aobj->obj_at_addr<T>(j));
   1.192          }
   1.193  
   1.194        } else {
   1.195 @@ -2423,13 +2428,13 @@
   1.196      FREE_C_HEAP_ARRAY(jint, _array_ind_stack);
   1.197    }
   1.198  
   1.199 -  void do_oop(narrowOop* p) {
   1.200 -    guarantee(false, "NYI");
   1.201 -  }
   1.202 -
   1.203 -  void do_oop(oop* p) {
   1.204 -    oop obj = *p;
   1.205 -    if (obj == NULL) return;
   1.206 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
   1.207 +  virtual void do_oop(      oop* p) { do_oop_work(p); }
   1.208 +
   1.209 +  template <class T> void do_oop_work(T* p) {
   1.210 +    T heap_oop = oopDesc::load_heap_oop(p);
   1.211 +    if (oopDesc::is_null(heap_oop)) return;
   1.212 +    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
   1.213      if (obj->is_forwarded()) {
   1.214        // If the object has already been forwarded, we have to make sure
   1.215        // that it's marked.  So follow the forwarding pointer.  Note that
   1.216 @@ -2478,7 +2483,11 @@
   1.217      oop obj = oop(addr);
   1.218      if (!obj->is_forwarded()) {
   1.219        if (!_oop_cl.push(obj)) return false;
   1.220 -      if (!_oop_cl.drain()) return false;
   1.221 +      if (UseCompressedOops) {
   1.222 +        if (!_oop_cl.drain<narrowOop>()) return false;
   1.223 +      } else {
   1.224 +        if (!_oop_cl.drain<oop>()) return false;
   1.225 +      }
   1.226      }
   1.227      // Otherwise...
   1.228      return true;
   1.229 @@ -2636,9 +2645,6 @@
   1.230  
   1.231  // abandon current marking iteration due to a Full GC
   1.232  void ConcurrentMark::abort() {
   1.233 -  // If we're not marking, nothing to do.
   1.234 -  if (!G1ConcMark) return;
   1.235 -
   1.236    // Clear all marks to force marking thread to do nothing
   1.237    _nextMarkBitMap->clearAll();
   1.238    // Empty mark stack
   1.239 @@ -2814,14 +2820,14 @@
   1.240    CMTask*            _task;
   1.241  
   1.242  public:
   1.243 -  void do_oop(narrowOop* p) {
   1.244 -    guarantee(false, "NYI");
   1.245 -  }
   1.246 -
   1.247 -  void do_oop(oop* p) {
   1.248 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
   1.249 +  virtual void do_oop(      oop* p) { do_oop_work(p); }
   1.250 +
   1.251 +  template <class T> void do_oop_work(T* p) {
   1.252      tmp_guarantee_CM( _g1h->is_in_g1_reserved((HeapWord*) p), "invariant" );
   1.253 -
   1.254 -    oop obj = *p;
   1.255 +    tmp_guarantee_CM( !_g1h->heap_region_containing((HeapWord*) p)->is_on_free_list(), "invariant" );
   1.256 +
   1.257 +    oop obj = oopDesc::load_decode_heap_oop(p);
   1.258      if (_cm->verbose_high())
   1.259        gclog_or_tty->print_cr("[%d] we're looking at location "
   1.260                               "*"PTR_FORMAT" = "PTR_FORMAT,
   1.261 @@ -2967,6 +2973,7 @@
   1.262    ++_refs_reached;
   1.263  
   1.264    HeapWord* objAddr = (HeapWord*) obj;
   1.265 +  assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
   1.266    if (_g1h->is_in_g1_reserved(objAddr)) {
   1.267      tmp_guarantee_CM( obj != NULL, "is_in_g1_reserved should ensure this" );
   1.268      HeapRegion* hr =  _g1h->heap_region_containing(obj);
   1.269 @@ -3030,6 +3037,7 @@
   1.270  void CMTask::push(oop obj) {
   1.271    HeapWord* objAddr = (HeapWord*) obj;
   1.272    tmp_guarantee_CM( _g1h->is_in_g1_reserved(objAddr), "invariant" );
   1.273 +  tmp_guarantee_CM( !_g1h->heap_region_containing(objAddr)->is_on_free_list(), "invariant" );
   1.274    tmp_guarantee_CM( !_g1h->is_obj_ill(obj), "invariant" );
   1.275    tmp_guarantee_CM( _nextMarkBitMap->isMarked(objAddr), "invariant" );
   1.276  
   1.277 @@ -3275,6 +3283,8 @@
   1.278  
   1.279        tmp_guarantee_CM( _g1h->is_in_g1_reserved((HeapWord*) obj),
   1.280                          "invariant" );
   1.281 +      tmp_guarantee_CM( !_g1h->heap_region_containing(obj)->is_on_free_list(),
   1.282 +                        "invariant" );
   1.283  
   1.284        scan_object(obj);
   1.285  

mercurial