Request for review (s) - 8031323: Optionally align objects copied to survivor spaces
Bengt Rutisson
bengt.rutisson at oracle.com
Tue Mar 18 13:30:38 UTC 2014
Hi Jon,
On 2014-03-17 05:40, Jon Masamitsu wrote:
> 8031323: Optionally align objects copied to survivor spaces
>
> Add the option to specify an alignment for allocations into the
> survivor spaces. Survivor space allocations will overflow if the
> survivor spaces have not been increased. The expected use
> is to align survivor space allocations to cache line sizes.
>
> http://cr.openjdk.java.net/~jmasa/8031323/webrev.00/
For G1 it looks to me like we are aligning objects in the old regions as
well. I thought the intent was to only align in the survivor regions. Am
I missing something?
Note that it is not enough to check the alloc purpose for G1 since
G1CollectedHeap::par_allocate_during_gc() only takes the purpose as a
hint and may still return buffers from other regions than expected for a
purpose. But I guess that in this case it is not too important to get it
exactly right, so it may be enough to check the alloc purpose value.
The code in PSYoungPromotionLAB::allcoate(),
ParGCAllocBuffer::allocate_aligned() and
ContiguousSpace::allocate_aligned() is very similar. Is there a way to
consolidate these methods?
The code in CollectedHeap::align_allocation_or_fail() looks quite
different from other places in the code base where we do padding. What
do you think about doing something like this instead?
inline HeapWord* CollectedHeap::align_allocation_or_fail(HeapWord* addr,
HeapWord* end, unsigned short alignment_in_bytes) {
if (alignment_in_bytes <= ObjectAlignmentInBytes) {
return addr;
}
assert(is_ptr_aligned(addr, HeapWordSize), "");
assert(is_size_aligned(alignment_in_bytes, HeapWordSize), "");
HeapWord* new_addr = (HeapWord*) align_pointer_up(addr,
alignment_in_bytes);
size_t padding = pointer_delta(new_addr, addr);
if (padding == 0) {
return addr;
}
if (padding < CollectedHeap::min_fill_size()) {
padding += alignment_in_bytes / HeapWordSize;
assert(padding >= CollectedHeap::min_fill_size(), "");
new_addr = addr + padding;
}
if(new_addr > addr && new_addr < end) {
CollectedHeap::fill_with_object(addr, padding);
return new_addr;
} else {
return NULL;
}
}
Thanks,
Bengt
>
> Jon
More information about the hotspot-gc-dev
mailing list