< prev index next > src/hotspot/share/gc/g1/g1HeapVerifier.cpp
Print this page
T heap_oop = RawAccess<>::oop_load(p);
if (!CompressedOops::is_null(heap_oop)) {
oop obj = CompressedOops::decode_not_null(heap_oop);
if (_g1h->is_obj_dead_cond(obj, _vo)) {
Log(gc, verify) log;
- log.error("Root location " PTR_FORMAT " points to dead obj " PTR_FORMAT, p2i(p), p2i(obj));
+ log.error("Root location " PTR_FORMAT " points to dead obj " PTR_FORMAT " vo %d", p2i(p), p2i(obj), _vo);
ResourceMark rm;
LogStream ls(log.error());
obj->print_on(&ls);
_failures = true;
}
};
class VerifyLivenessOopClosure: public BasicOopIterateClosure {
G1CollectedHeap* _g1h;
VerifyOption _vo;
+ oop _o;
public:
- VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo):
- _g1h(g1h), _vo(vo)
+ VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo, oop o):
+ _g1h(g1h), _vo(vo), _o(o)
{ }
void do_oop(narrowOop *p) { do_oop_work(p); }
void do_oop( oop *p) { do_oop_work(p); }
template <class T> void do_oop_work(T *p) {
oop obj = RawAccess<>::oop_load(p);
guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo),
- "Dead object referenced by a not dead object");
+ "vo %d Dead object " PTR_FORMAT " (%s) referenced by a not dead object " PTR_FORMAT " (%s) _g1h->is_obj_dead_cond(obj, _vo) %d marked %d since prev mark %d since next mark %d",
+ _vo,
+ p2i(obj), _g1h->heap_region_containing(obj)->get_short_type_str(),
+ p2i(_o), _g1h->heap_region_containing(_o)->get_short_type_str(),
+ _g1h->is_obj_dead_cond(obj, _vo),
+ _g1h->concurrent_mark()->prev_mark_bitmap()->is_marked(_o),
+ _g1h->heap_region_containing(_o)->obj_allocated_since_prev_marking(_o),
+ _g1h->heap_region_containing(_o)->obj_allocated_since_next_marking(_o)
+ );
}
};
class VerifyObjsInRegionClosure: public ObjectClosure {
private:
VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo)
: _live_bytes(0), _hr(hr), _vo(vo) {
_g1h = G1CollectedHeap::heap();
}
void do_object(oop o) {
- VerifyLivenessOopClosure isLive(_g1h, _vo);
+ VerifyLivenessOopClosure isLive(_g1h, _vo, o);
assert(o != NULL, "Huh?");
if (!_g1h->is_obj_dead_cond(o, _vo)) {
// If the object is alive according to the full gc mark,
// then verify that the marking information agrees.
// Note we can't verify the contra-positive of the
< prev index next >