2207 2208 //////////////////////////////////////////////////////// 2209 // CMS Verification Support 2210 //////////////////////////////////////////////////////// 2211 // Following the remark phase, the following invariant 2212 // should hold -- each object in the CMS heap which is 2213 // marked in markBitMap() should be marked in the verification_mark_bm(). 2214 2215 class VerifyMarkedClosure: public BitMapClosure { 2216 CMSBitMap* _marks; 2217 bool _failed; 2218 2219 public: 2220 VerifyMarkedClosure(CMSBitMap* bm): _marks(bm), _failed(false) {} 2221 2222 bool do_bit(size_t offset) { 2223 HeapWord* addr = _marks->offsetToHeapWord(offset); 2224 if (!_marks->isMarked(addr)) { 2225 LogHandle(gc, verify) log; 2226 ResourceMark rm; 2227 oop(addr)->print_on(log.info_stream()); 2228 log.info(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); 2229 _failed = true; 2230 } 2231 return true; 2232 } 2233 2234 bool failed() { return _failed; } 2235 }; 2236 2237 bool CMSCollector::verify_after_remark() { 2238 GCTraceTime(Info, gc, verify) tm("Verifying CMS Marking."); 2239 MutexLockerEx ml(verification_mark_bm()->lock(), Mutex::_no_safepoint_check_flag); 2240 static bool init = false; 2241 2242 assert(SafepointSynchronize::is_at_safepoint(), 2243 "Else mutations in object graph will make answer suspect"); 2244 assert(have_cms_token(), 2245 "Else there may be mutual interference in use of " 2246 " verification data structures"); 2247 assert(_collectorState > Marking && _collectorState <= Sweeping, 2248 "Else marking info checked here may be obsolete"); 2333 assert(_restart_addr == NULL, "Expected pre-condition"); 2334 verification_mark_bm()->iterate(&markFromRootsClosure); 2335 while (_restart_addr != NULL) { 2336 // Deal with stack overflow: by restarting at the indicated 2337 // address. 2338 HeapWord* ra = _restart_addr; 2339 markFromRootsClosure.reset(ra); 2340 _restart_addr = NULL; 2341 verification_mark_bm()->iterate(&markFromRootsClosure, ra, _span.end()); 2342 } 2343 assert(verification_mark_stack()->isEmpty(), "Should have been drained"); 2344 verify_work_stacks_empty(); 2345 2346 // Marking completed -- now verify that each bit marked in 2347 // verification_mark_bm() is also marked in markBitMap(); flag all 2348 // errors by printing corresponding objects. 2349 VerifyMarkedClosure vcl(markBitMap()); 2350 verification_mark_bm()->iterate(&vcl); 2351 if (vcl.failed()) { 2352 LogHandle(gc, verify) log; 2353 log.info("Verification failed"); 2354 ResourceMark rm; 2355 gch->print_on(log.info_stream()); 2356 fatal("CMS: failed marking verification after remark"); 2357 } 2358 } 2359 2360 class VerifyKlassOopsKlassClosure : public KlassClosure { 2361 class VerifyKlassOopsClosure : public OopClosure { 2362 CMSBitMap* _bitmap; 2363 public: 2364 VerifyKlassOopsClosure(CMSBitMap* bitmap) : _bitmap(bitmap) { } 2365 void do_oop(oop* p) { guarantee(*p == NULL || _bitmap->isMarked((HeapWord*) *p), "Should be marked"); } 2366 void do_oop(narrowOop* p) { ShouldNotReachHere(); } 2367 } _oop_closure; 2368 public: 2369 VerifyKlassOopsKlassClosure(CMSBitMap* bitmap) : _oop_closure(bitmap) {} 2370 void do_klass(Klass* k) { 2371 k->oops_do(&_oop_closure); 2372 } 2373 }; 2374 2375 void CMSCollector::verify_after_remark_work_2() { 5863 // A variant of the above, used for CMS marking verification. 5864 MarkRefsIntoVerifyClosure::MarkRefsIntoVerifyClosure( 5865 MemRegion span, CMSBitMap* verification_bm, CMSBitMap* cms_bm): 5866 _span(span), 5867 _verification_bm(verification_bm), 5868 _cms_bm(cms_bm) 5869 { 5870 assert(ref_processor() == NULL, "deliberately left NULL"); 5871 assert(_verification_bm->covers(_span), "_verification_bm/_span mismatch"); 5872 } 5873 5874 void MarkRefsIntoVerifyClosure::do_oop(oop obj) { 5875 // if p points into _span, then mark corresponding bit in _markBitMap 5876 assert(obj->is_oop(), "expected an oop"); 5877 HeapWord* addr = (HeapWord*)obj; 5878 if (_span.contains(addr)) { 5879 _verification_bm->mark(addr); 5880 if (!_cms_bm->isMarked(addr)) { 5881 LogHandle(gc, verify) log; 5882 ResourceMark rm; 5883 oop(addr)->print_on(log.info_stream()); 5884 log.info(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); 5885 fatal("... aborting"); 5886 } 5887 } 5888 } 5889 5890 void MarkRefsIntoVerifyClosure::do_oop(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); } 5891 void MarkRefsIntoVerifyClosure::do_oop(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); } 5892 5893 ////////////////////////////////////////////////// 5894 // MarkRefsIntoAndScanClosure 5895 ////////////////////////////////////////////////// 5896 5897 MarkRefsIntoAndScanClosure::MarkRefsIntoAndScanClosure(MemRegion span, 5898 ReferenceProcessor* rp, 5899 CMSBitMap* bit_map, 5900 CMSBitMap* mod_union_table, 5901 CMSMarkStack* mark_stack, 5902 CMSCollector* collector, 5903 bool should_yield, 5904 bool concurrent_precleaning): 6644 // Upon stack overflow, we discard (part of) the stack, 6645 // remembering the least address amongst those discarded 6646 // in CMSCollector's _restart_address. 6647 void PushAndMarkVerifyClosure::handle_stack_overflow(HeapWord* lost) { 6648 // Remember the least grey address discarded 6649 HeapWord* ra = (HeapWord*)_mark_stack->least_value(lost); 6650 _collector->lower_restart_addr(ra); 6651 _mark_stack->reset(); // discard stack contents 6652 _mark_stack->expand(); // expand the stack if possible 6653 } 6654 6655 void PushAndMarkVerifyClosure::do_oop(oop obj) { 6656 assert(obj->is_oop_or_null(), "Expected an oop or NULL at " PTR_FORMAT, p2i(obj)); 6657 HeapWord* addr = (HeapWord*)obj; 6658 if (_span.contains(addr) && !_verification_bm->isMarked(addr)) { 6659 // Oop lies in _span and isn't yet grey or black 6660 _verification_bm->mark(addr); // now grey 6661 if (!_cms_bm->isMarked(addr)) { 6662 LogHandle(gc, verify) log; 6663 ResourceMark rm; 6664 oop(addr)->print_on(log.info_stream()); 6665 log.info(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); 6666 fatal("... aborting"); 6667 } 6668 6669 if (!_mark_stack->push(obj)) { // stack overflow 6670 log_trace(gc)("CMS marking stack overflow (benign) at " SIZE_FORMAT, _mark_stack->capacity()); 6671 assert(_mark_stack->isFull(), "Else push should have succeeded"); 6672 handle_stack_overflow(addr); 6673 } 6674 // anything including and to the right of _finger 6675 // will be scanned as we iterate over the remainder of the 6676 // bit map 6677 } 6678 } 6679 6680 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, 6681 MemRegion span, 6682 CMSBitMap* bitMap, CMSMarkStack* markStack, 6683 HeapWord* finger, MarkFromRootsClosure* parent) : 6684 MetadataAwareOopClosure(collector->ref_processor()), 6685 _collector(collector), | 2207 2208 //////////////////////////////////////////////////////// 2209 // CMS Verification Support 2210 //////////////////////////////////////////////////////// 2211 // Following the remark phase, the following invariant 2212 // should hold -- each object in the CMS heap which is 2213 // marked in markBitMap() should be marked in the verification_mark_bm(). 2214 2215 class VerifyMarkedClosure: public BitMapClosure { 2216 CMSBitMap* _marks; 2217 bool _failed; 2218 2219 public: 2220 VerifyMarkedClosure(CMSBitMap* bm): _marks(bm), _failed(false) {} 2221 2222 bool do_bit(size_t offset) { 2223 HeapWord* addr = _marks->offsetToHeapWord(offset); 2224 if (!_marks->isMarked(addr)) { 2225 LogHandle(gc, verify) log; 2226 ResourceMark rm; 2227 oop(addr)->print_on(log.error_stream()); 2228 log.error(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); 2229 _failed = true; 2230 } 2231 return true; 2232 } 2233 2234 bool failed() { return _failed; } 2235 }; 2236 2237 bool CMSCollector::verify_after_remark() { 2238 GCTraceTime(Info, gc, verify) tm("Verifying CMS Marking."); 2239 MutexLockerEx ml(verification_mark_bm()->lock(), Mutex::_no_safepoint_check_flag); 2240 static bool init = false; 2241 2242 assert(SafepointSynchronize::is_at_safepoint(), 2243 "Else mutations in object graph will make answer suspect"); 2244 assert(have_cms_token(), 2245 "Else there may be mutual interference in use of " 2246 " verification data structures"); 2247 assert(_collectorState > Marking && _collectorState <= Sweeping, 2248 "Else marking info checked here may be obsolete"); 2333 assert(_restart_addr == NULL, "Expected pre-condition"); 2334 verification_mark_bm()->iterate(&markFromRootsClosure); 2335 while (_restart_addr != NULL) { 2336 // Deal with stack overflow: by restarting at the indicated 2337 // address. 2338 HeapWord* ra = _restart_addr; 2339 markFromRootsClosure.reset(ra); 2340 _restart_addr = NULL; 2341 verification_mark_bm()->iterate(&markFromRootsClosure, ra, _span.end()); 2342 } 2343 assert(verification_mark_stack()->isEmpty(), "Should have been drained"); 2344 verify_work_stacks_empty(); 2345 2346 // Marking completed -- now verify that each bit marked in 2347 // verification_mark_bm() is also marked in markBitMap(); flag all 2348 // errors by printing corresponding objects. 2349 VerifyMarkedClosure vcl(markBitMap()); 2350 verification_mark_bm()->iterate(&vcl); 2351 if (vcl.failed()) { 2352 LogHandle(gc, verify) log; 2353 log.error("Failed marking verification after remark"); 2354 ResourceMark rm; 2355 gch->print_on(log.error_stream()); 2356 fatal("CMS: failed marking verification after remark"); 2357 } 2358 } 2359 2360 class VerifyKlassOopsKlassClosure : public KlassClosure { 2361 class VerifyKlassOopsClosure : public OopClosure { 2362 CMSBitMap* _bitmap; 2363 public: 2364 VerifyKlassOopsClosure(CMSBitMap* bitmap) : _bitmap(bitmap) { } 2365 void do_oop(oop* p) { guarantee(*p == NULL || _bitmap->isMarked((HeapWord*) *p), "Should be marked"); } 2366 void do_oop(narrowOop* p) { ShouldNotReachHere(); } 2367 } _oop_closure; 2368 public: 2369 VerifyKlassOopsKlassClosure(CMSBitMap* bitmap) : _oop_closure(bitmap) {} 2370 void do_klass(Klass* k) { 2371 k->oops_do(&_oop_closure); 2372 } 2373 }; 2374 2375 void CMSCollector::verify_after_remark_work_2() { 5863 // A variant of the above, used for CMS marking verification. 5864 MarkRefsIntoVerifyClosure::MarkRefsIntoVerifyClosure( 5865 MemRegion span, CMSBitMap* verification_bm, CMSBitMap* cms_bm): 5866 _span(span), 5867 _verification_bm(verification_bm), 5868 _cms_bm(cms_bm) 5869 { 5870 assert(ref_processor() == NULL, "deliberately left NULL"); 5871 assert(_verification_bm->covers(_span), "_verification_bm/_span mismatch"); 5872 } 5873 5874 void MarkRefsIntoVerifyClosure::do_oop(oop obj) { 5875 // if p points into _span, then mark corresponding bit in _markBitMap 5876 assert(obj->is_oop(), "expected an oop"); 5877 HeapWord* addr = (HeapWord*)obj; 5878 if (_span.contains(addr)) { 5879 _verification_bm->mark(addr); 5880 if (!_cms_bm->isMarked(addr)) { 5881 LogHandle(gc, verify) log; 5882 ResourceMark rm; 5883 oop(addr)->print_on(log.error_stream()); 5884 log.error(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); 5885 fatal("... aborting"); 5886 } 5887 } 5888 } 5889 5890 void MarkRefsIntoVerifyClosure::do_oop(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); } 5891 void MarkRefsIntoVerifyClosure::do_oop(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); } 5892 5893 ////////////////////////////////////////////////// 5894 // MarkRefsIntoAndScanClosure 5895 ////////////////////////////////////////////////// 5896 5897 MarkRefsIntoAndScanClosure::MarkRefsIntoAndScanClosure(MemRegion span, 5898 ReferenceProcessor* rp, 5899 CMSBitMap* bit_map, 5900 CMSBitMap* mod_union_table, 5901 CMSMarkStack* mark_stack, 5902 CMSCollector* collector, 5903 bool should_yield, 5904 bool concurrent_precleaning): 6644 // Upon stack overflow, we discard (part of) the stack, 6645 // remembering the least address amongst those discarded 6646 // in CMSCollector's _restart_address. 6647 void PushAndMarkVerifyClosure::handle_stack_overflow(HeapWord* lost) { 6648 // Remember the least grey address discarded 6649 HeapWord* ra = (HeapWord*)_mark_stack->least_value(lost); 6650 _collector->lower_restart_addr(ra); 6651 _mark_stack->reset(); // discard stack contents 6652 _mark_stack->expand(); // expand the stack if possible 6653 } 6654 6655 void PushAndMarkVerifyClosure::do_oop(oop obj) { 6656 assert(obj->is_oop_or_null(), "Expected an oop or NULL at " PTR_FORMAT, p2i(obj)); 6657 HeapWord* addr = (HeapWord*)obj; 6658 if (_span.contains(addr) && !_verification_bm->isMarked(addr)) { 6659 // Oop lies in _span and isn't yet grey or black 6660 _verification_bm->mark(addr); // now grey 6661 if (!_cms_bm->isMarked(addr)) { 6662 LogHandle(gc, verify) log; 6663 ResourceMark rm; 6664 oop(addr)->print_on(log.error_stream()); 6665 log.error(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); 6666 fatal("... aborting"); 6667 } 6668 6669 if (!_mark_stack->push(obj)) { // stack overflow 6670 log_trace(gc)("CMS marking stack overflow (benign) at " SIZE_FORMAT, _mark_stack->capacity()); 6671 assert(_mark_stack->isFull(), "Else push should have succeeded"); 6672 handle_stack_overflow(addr); 6673 } 6674 // anything including and to the right of _finger 6675 // will be scanned as we iterate over the remainder of the 6676 // bit map 6677 } 6678 } 6679 6680 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, 6681 MemRegion span, 6682 CMSBitMap* bitMap, CMSMarkStack* markStack, 6683 HeapWord* finger, MarkFromRootsClosure* parent) : 6684 MetadataAwareOopClosure(collector->ref_processor()), 6685 _collector(collector), |