提交 0c37f5bb 编写于 作者: Y ysr

7029036: Card-table verification hangs with all framework collectors, except...

7029036: Card-table verification hangs with all framework collectors, except G1, even before the first GC
Summary: When verifying clean card ranges, use memory-range-bounded iteration over oops of objects overlapping that range, thus avoiding the otherwise quadratic worst-case cost of scanning large object arrays.
Reviewed-by: jmasa, jwilhelm, tonyp
上级 6a8c2c8b
...@@ -318,17 +318,28 @@ private: ...@@ -318,17 +318,28 @@ private:
protected: protected:
template <class T> void do_oop_work(T* p) { template <class T> void do_oop_work(T* p) {
HeapWord* jp = (HeapWord*)p; HeapWord* jp = (HeapWord*)p;
if (jp >= _begin && jp < _end) { assert(jp >= _begin && jp < _end,
err_msg("Error: jp " PTR_FORMAT " should be within "
"[_begin, _end) = [" PTR_FORMAT "," PTR_FORMAT ")",
_begin, _end));
oop obj = oopDesc::load_decode_heap_oop(p); oop obj = oopDesc::load_decode_heap_oop(p);
guarantee(obj == NULL || guarantee(obj == NULL || (HeapWord*)obj >= _boundary,
(HeapWord*)p < _boundary || err_msg("pointer " PTR_FORMAT " at " PTR_FORMAT " on "
(HeapWord*)obj >= _boundary, "clean card crosses boundary" PTR_FORMAT,
"pointer on clean card crosses boundary"); (HeapWord*)obj, jp, _boundary));
}
} }
public: public:
VerifyCleanCardClosure(HeapWord* b, HeapWord* begin, HeapWord* end) : VerifyCleanCardClosure(HeapWord* b, HeapWord* begin, HeapWord* end) :
_boundary(b), _begin(begin), _end(end) {} _boundary(b), _begin(begin), _end(end) {
assert(b <= begin,
err_msg("Error: boundary " PTR_FORMAT " should be at or below begin " PTR_FORMAT,
b, begin));
assert(begin <= end,
err_msg("Error: begin " PTR_FORMAT " should be strictly below end " PTR_FORMAT,
begin, end));
}
virtual void do_oop(oop* p) { VerifyCleanCardClosure::do_oop_work(p); } virtual void do_oop(oop* p) { VerifyCleanCardClosure::do_oop_work(p); }
virtual void do_oop(narrowOop* p) { VerifyCleanCardClosure::do_oop_work(p); } virtual void do_oop(narrowOop* p) { VerifyCleanCardClosure::do_oop_work(p); }
}; };
...@@ -392,13 +403,14 @@ void CardTableRS::verify_space(Space* s, HeapWord* gen_boundary) { ...@@ -392,13 +403,14 @@ void CardTableRS::verify_space(Space* s, HeapWord* gen_boundary) {
} }
} }
// Now traverse objects until end. // Now traverse objects until end.
HeapWord* cur = start_block; if (begin < end) {
MemRegion mr(begin, end);
VerifyCleanCardClosure verify_blk(gen_boundary, begin, end); VerifyCleanCardClosure verify_blk(gen_boundary, begin, end);
while (cur < end) { for (HeapWord* cur = start_block; cur < end; cur += s->block_size(cur)) {
if (s->block_is_obj(cur) && s->obj_is_alive(cur)) { if (s->block_is_obj(cur) && s->obj_is_alive(cur)) {
oop(cur)->oop_iterate(&verify_blk); oop(cur)->oop_iterate(&verify_blk, mr);
}
} }
cur += s->block_size(cur);
} }
cur_entry = first_dirty; cur_entry = first_dirty;
} else { } else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册