RFR (S): 8069760: When iterating over a card, G1 often iterates over much more references than are contained in the card
Thomas Schatzl
thomas.schatzl at oracle.com
Wed Jan 28 13:00:23 UTC 2015
Hi Kim,
thanks for the review and thanks for finding these issues.
New webrevs:
http://cr.openjdk.java.net/~tschatzl/8069760/webrev.0_to_1/ (diff)
http://cr.openjdk.java.net/~tschatzl/8069760/webrev.1/ (full)
It passed another jprt run.
More comments below.
On Tue, 2015-01-27 at 18:27 -0500, Kim Barrett wrote:
> On Jan 27, 2015, at 8:21 AM, Thomas Schatzl <thomas.schatzl at oracle.com> wrote:
> >
> > CR:
> > https://bugs.openjdk.java.net/browse/JDK-8069760
> >
> > Webrev:
> > http://cr.openjdk.java.net/~tschatzl/8069760/webrev/
> >
> > Testing:
> > nosql, dev-submit performance testing (specj*), vm.quick.testlist, jprt.
>
> ------------------------------------------------------------------------------
> src/share/vm/gc_implementation/g1/heapRegion.cpp
> 443 assert(obj == oop(cur), "Loop invariant");
>
> This and later references to "obj" in the first iteration depend on
> the assignment of "obj" in the loop back at
> 425 obj = oop(cur);
>
> It required some careful study to conclude that "obj" is guaranteed to
> be initialized and have the proper value at line 443. I think it
> would be better to move the update of "obj" from the end of the loop
> (line 463) to the head of the loop (after line 440). Of course, then
> eliminate the unnecessary assert(obj == oop(cur), ...).
Fixed.
>
> ------------------------------------------------------------------------------
> src/share/vm/gc_implementation/g1/heapRegion.cpp
> 453 // Non-object arrays are sometimes marked imprecise at the object start. We
>
> I think "Non-object arrays" would be clearer as "Non-objArrays". At
> least, I think that's the intent. As written I read it as arrays of
> non-objects, e.g. primitive arrays such as int[].
>
Fixed.
> ------------------------------------------------------------------------------
> src/share/vm/gc_implementation/g1/heapRegion.cpp
> 440 do {
> 441 assert(obj->klass_or_null() != NULL, "Loop invariant");
> ...
> 444 if (obj->klass_or_null() == NULL) {
>
> Line 444 can never be true if the assertion at line 441 is correct.
>
> The assertion block from line 441-443 used to be before the loop, and
> has now been hoisted into the loop. I'm not sure that's correct, and
> this inconsistency is a large part of what makes that move look
> suspect. Or maybe it should be moved after the
> if (obj->klass_or_null() == NULL)
> check? But then we might be missing the first iteration assertion
> that the klass is != NULL.
Moved the assert outside of the loop, although I think it is
superfluous.
>
> ------------------------------------------------------------------------------
> src/share/vm/gc_implementation/g1/heapRegion.cpp
> 678 // gclog_or_tty->print_cr("Verifying address " PTR_FORMAT, p2i(p));
>
> Leftover debug print statement.
>
Fixed.
Thanks,
Thomas
More information about the hotspot-gc-dev
mailing list