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,
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.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,
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("Verification failed");
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),
|