496 VerifyLiveClosure(G1CollectedHeap* g1h, VerifyOption vo) : G1VerificationClosure(g1h, vo) {}
497 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
498 virtual void do_oop(oop* p) { do_oop_work(p); }
499
500 template <class T>
501 void do_oop_work(T* p) {
502 assert(_containing_obj != NULL, "Precondition");
503 assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
504 "Precondition");
505 verify_liveness(p);
506 }
507
508 template <class T>
509 void verify_liveness(T* p) {
510 T heap_oop = RawAccess<>::oop_load(p);
511 Log(gc, verify) log;
512 if (!CompressedOops::is_null(heap_oop)) {
513 oop obj = CompressedOops::decode_not_null(heap_oop);
514 bool failed = false;
515 if (!_g1h->is_in_closed_subset(obj) || _g1h->is_obj_dead_cond(obj, _vo)) {
516 MutexLockerEx x(ParGCRareEvent_lock,
517 Mutex::_no_safepoint_check_flag);
518
519 if (!_failures) {
520 log.error("----------");
521 }
522 ResourceMark rm;
523 if (!_g1h->is_in_closed_subset(obj)) {
524 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
525 log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
526 p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end()));
527 LogStream ls(log.error());
528 print_object(&ls, _containing_obj);
529 HeapRegion* const to = _g1h->heap_region_containing(obj);
530 log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str());
531 } else {
532 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
533 HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj);
534 log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
535 p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end()));
536 LogStream ls(log.error());
537 print_object(&ls, _containing_obj);
567 T heap_oop = RawAccess<>::oop_load(p);
568 Log(gc, verify) log;
569 if (!CompressedOops::is_null(heap_oop)) {
570 oop obj = CompressedOops::decode_not_null(heap_oop);
571 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
572 HeapRegion* to = _g1h->heap_region_containing(obj);
573 if (from != NULL && to != NULL &&
574 from != to &&
575 !to->is_pinned() &&
576 to->rem_set()->is_complete()) {
577 jbyte cv_obj = *_ct->byte_for_const(_containing_obj);
578 jbyte cv_field = *_ct->byte_for_const(p);
579 const jbyte dirty = G1CardTable::dirty_card_val();
580
581 bool is_bad = !(from->is_young()
582 || to->rem_set()->contains_reference(p)
583 || (_containing_obj->is_objArray() ?
584 cv_field == dirty :
585 cv_obj == dirty || cv_field == dirty));
586 if (is_bad) {
587 MutexLockerEx x(ParGCRareEvent_lock,
588 Mutex::_no_safepoint_check_flag);
589
590 if (!_failures) {
591 log.error("----------");
592 }
593 log.error("Missing rem set entry:");
594 log.error("Field " PTR_FORMAT " of obj " PTR_FORMAT ", in region " HR_FORMAT,
595 p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from));
596 ResourceMark rm;
597 LogStream ls(log.error());
598 _containing_obj->print_on(&ls);
599 log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str());
600 if (oopDesc::is_oop(obj)) {
601 obj->print_on(&ls);
602 }
603 log.error("Obj head CTE = %d, field CTE = %d.", cv_obj, cv_field);
604 log.error("----------");
605 _failures = true;
606 _n_failures++;
607 }
608 }
|
496 VerifyLiveClosure(G1CollectedHeap* g1h, VerifyOption vo) : G1VerificationClosure(g1h, vo) {}
497 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
498 virtual void do_oop(oop* p) { do_oop_work(p); }
499
500 template <class T>
501 void do_oop_work(T* p) {
502 assert(_containing_obj != NULL, "Precondition");
503 assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
504 "Precondition");
505 verify_liveness(p);
506 }
507
508 template <class T>
509 void verify_liveness(T* p) {
510 T heap_oop = RawAccess<>::oop_load(p);
511 Log(gc, verify) log;
512 if (!CompressedOops::is_null(heap_oop)) {
513 oop obj = CompressedOops::decode_not_null(heap_oop);
514 bool failed = false;
515 if (!_g1h->is_in_closed_subset(obj) || _g1h->is_obj_dead_cond(obj, _vo)) {
516 MutexLocker x(ParGCRareEvent_lock);
517
518 if (!_failures) {
519 log.error("----------");
520 }
521 ResourceMark rm;
522 if (!_g1h->is_in_closed_subset(obj)) {
523 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
524 log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
525 p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end()));
526 LogStream ls(log.error());
527 print_object(&ls, _containing_obj);
528 HeapRegion* const to = _g1h->heap_region_containing(obj);
529 log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str());
530 } else {
531 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
532 HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj);
533 log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")",
534 p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end()));
535 LogStream ls(log.error());
536 print_object(&ls, _containing_obj);
566 T heap_oop = RawAccess<>::oop_load(p);
567 Log(gc, verify) log;
568 if (!CompressedOops::is_null(heap_oop)) {
569 oop obj = CompressedOops::decode_not_null(heap_oop);
570 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p);
571 HeapRegion* to = _g1h->heap_region_containing(obj);
572 if (from != NULL && to != NULL &&
573 from != to &&
574 !to->is_pinned() &&
575 to->rem_set()->is_complete()) {
576 jbyte cv_obj = *_ct->byte_for_const(_containing_obj);
577 jbyte cv_field = *_ct->byte_for_const(p);
578 const jbyte dirty = G1CardTable::dirty_card_val();
579
580 bool is_bad = !(from->is_young()
581 || to->rem_set()->contains_reference(p)
582 || (_containing_obj->is_objArray() ?
583 cv_field == dirty :
584 cv_obj == dirty || cv_field == dirty));
585 if (is_bad) {
586 MutexLocker x(ParGCRareEvent_lock);
587
588 if (!_failures) {
589 log.error("----------");
590 }
591 log.error("Missing rem set entry:");
592 log.error("Field " PTR_FORMAT " of obj " PTR_FORMAT ", in region " HR_FORMAT,
593 p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from));
594 ResourceMark rm;
595 LogStream ls(log.error());
596 _containing_obj->print_on(&ls);
597 log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str());
598 if (oopDesc::is_oop(obj)) {
599 obj->print_on(&ls);
600 }
601 log.error("Obj head CTE = %d, field CTE = %d.", cv_obj, cv_field);
602 log.error("----------");
603 _failures = true;
604 _n_failures++;
605 }
606 }
|