Superword - Aligning arrays
John Rose
John.Rose at Sun.COM
Wed Feb 4 15:42:33 PST 2009
On Feb 4, 2009, at 9:40 AM, James Walsh wrote:
> Thanks again for the help. I probably wouldn't be to where I am now
> for another couple months without it.
My pleasure!
> While looking through the GC code it appeared to me that the heap is
> traversed by grabbing a pointer and then indexing through based on
> the size of the oop headers. If that is the case then how would I
> deal with arrays that don't end up on the object alignment boundary?
In general, the heap must always be "parseable" into objects in this
way. (There are exceptions; the tail-end of a TLAB and certain other
unused areas can contain complete garbage. Also, concurrent marking
requires extra semi-parseable intermediate states. As the GC guys for
more info; that's about all I know.)
So, in this case, if a big object must be aligned strongly, you have
to insert a little half-sized filler object before it, to "bump it
up". The filler object must be a valid object (or at least parseable
as a heap block). So when the heap is scanned, the scan comes first
to the filler, reads the header, and skips up to the next object,
which is the big, aligned array. Make sense?
> I assume that if I alter the length of the array it will show up in
> the java code if someone is indexing through an array until
> array.length. Do I need to change how the size of the oop is
> computed to take into account the possibility of a extra alignment
> word?
There's no need to change array.length here.
(I suppose you could consider changing oopDesc::size_given_klass for
big objects to add extra round-ups to the size. Beware: That routine
(along with its variations) is performance-critical. See also uses of
align_object_size and MinObjAlignmentInBytes. Wherever those guys
appear, if a large object is a possibility, you would have to put a
conditional to apply the correct alignment.)
But that's probably more trouble than it's worth. If you insert the
filler objects to bump up the alignment, you can let the tail of the
big array be as unaligned as any other object, as long as you never
perform vector writes that cross the ragged end of the array. That's
simpler. Inserting padding objects is much less risky than changing
the object sizing or heap-parsing logic.
-- John
More information about the hotspot-dev
mailing list