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