CRR (S): 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array

Tony Printezis tony.printezis at oracle.com
Thu Dec 22 08:23:33 UTC 2011


Ramki,

(sorry, I forgot to answer your question) We could implement the same 
encoding on the other GCs but I'm not sure whether it's worth it. Of 
course, if we had the encoding / decoding code factored out we could 
have done it with no much effort. :-)

Tony

On 12/22/2011 01:31 AM, Srinivas Ramakrishna wrote:
> Thanks Tony for the clear explanation of the context!. So did you have 
> any opinion about the second part of my email below? (not that
> that issue needs to be done in this CR or anything, but just thought 
> it would be nice to have all scavengers use this encoding.)
>
> -- ramki
>
>
> On Wed, Dec 21, 2011 at 12:53 AM, Tony Printezis 
> <tony.printezis at oracle.com <mailto:tony.printezis at oracle.com>> wrote:
>
>     Ramki,
>
>     Thanks for looking at this! Here's an explanation why we need this:
>
>     (As you know!) in G1 we don't have an initial-mark pause and we
>     piggy-back marking the roots on an evacuation pause. This means
>     that we might have to mark an object we are copying / have copied.
>     This is mostly straightforward and it's been in G1 for quite a while.
>
>     John is working on some changes to piggy-back liveness counting on
>     the marking phase. For that we need to know the size of each
>     object we mark. For objects that are being moved this is not as
>     straightforward. Consider the case where a thread is scanning a
>     root that points to an object being copied by another thread. Even
>     though we know the reference to the from-/to-images we do not know
>     whether the to-image is actually complete given that an object
>     gets forwarded first, then copied and there's no easy way to find
>     out whether it's been copied or not without some additional
>     synchronization which it'd be good to avoid: we only need this
>     during initial-mark pauses which are infrequent.
>
>     One idea is to always read the size from the from-image, which
>     works mots of the time apart from the case where the object is a
>     chunked object array since we use its length to store how much of
>     the object we have not processed yet (and without its length we
>     cannot work out its size). Again, currently there's no way to
>     determine whether the length is the actual length or an encoded
>     index given that they both look like ints >= 0. Encoding it as a
>     negative integer, which is what this changeset does, allows us to
>     distinguish a valid length (>=0) from an encoded index (<0).
>
>     FWIW, here's the code (from a follow-up changeset) that relies on
>     this encoding to calculate the size of a forwarded object (old ->
>     from-image, obj -> to-image):
>
>       int size;
>       if (!old->is_objArray()) {
>         // The easy case. This is safe, the from-image of all non-object
>         // arrays should be well formed.
>         size = old->size();
>       } else {
>         objArrayOop array_old = objArrayOop(old);
>         int length = array_old->length();
>         if (length < 0) {
>           // It's been chunked so we cannot trust the from-image. We will
>           // get the size from the to-image which we know is well formed
>           // (copy is finished before the length becomes negative).
>           objArrayOop array_obj = objArrayOop(obj);
>           length = array_obj->length();
>         } else {
>           // Because the length is positive we know it's correct, i.e. the
>           // array is not being chunked right now.
>         }
>         size = objArrayOopDesc::object_size(length);
>       }
>
>     Hope this clears things up.
>
>     Tony
>
>
>     On 12/21/2011 01:34 AM, Srinivas Ramakrishna wrote:
>>     Hi Tony --
>>
>>     For some reason, I cannot seem to be able to view either of the
>>     CR's you mention below, and thus
>>     lack the requisite background context for this change. The
>>     localized change however looks fine,
>>     and it is nice to distinguish the two states of the array in this
>>     way by means of the sign of the length field.
>>
>>     One question is whether, for the sake of debugging &
>>     representational uniformity, it would make sense to use the same
>>     encoding in the other collectors that do this chunking (even
>>     though I understand they may not have
>>     the need to deal with 6484965, whatever that might be :-)
>>
>>     Reviewed!
>>     -- ramki
>>
>>     On Wed, Dec 14, 2011 at 2:17 PM, Tony Printezis
>>     <tony.printezis at oracle.com <mailto:tony.printezis at oracle.com>> wrote:
>>
>>         Hi all,
>>
>>         Can I have a couple of code review for this small change?
>>
>>         http://cr.openjdk.java.net/~tonyp/7121623/webrev.0/
>>         <http://cr.openjdk.java.net/%7Etonyp/7121623/webrev.0/>
>>
>>         The CR has a bit more explanation. The short version is that
>>         I'm now encoding the "start index of the next chunk" in the
>>         from-space length field of a chunked array (say *that*
>>         quickly!) as a negative value to always be able to
>>         distinguish it from the real length. This will simplify the
>>         code for the CR John is currently working on (6484965) but
>>         it's a small, self-contained change so it's good to get it
>>         code reviewed and pushed separately.
>>
>>         Tony
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20111222/c4037cf5/attachment.htm>


More information about the hotspot-gc-dev mailing list