[RFR] (M) 8143608: Don't 64-bit align start of InstanceKlass vtable, itable, and nonstatic_oopmap on 32-bit systems

Chris Plummer chris.plummer at oracle.com
Mon Dec 21 20:32:42 UTC 2015


Hello,

I'm doing a bit of a reset on this thread. I've updated the webrev. The 
only change is fixing SA to also no longer do the aligning:

https://bugs.openjdk.java.net/browse/JDK-8143608
http://cr.openjdk.java.net/~cjplummer/8143608/webrev.03/webrev.hotspot/

I've also filed the following CRs for pre-existing bugs instead of 
addressing them with these changes:

https://bugs.openjdk.java.net/browse/JDK-8145627 -
     sun.jvm.hotspot.oops.InstanceKlass::getSize() returns the incorrect 
size and has no test
https://bugs.openjdk.java.net/browse/JDK-8145628
hotspot metadata classes shouldn't use HeapWordSize or heap related 
macros like align_object_size

And just restating here why I think the removal of these 
align_object_field references is safe:

The argument to align_object_offset() is the offset in words, and it 
returns the offset in words after aligning to a HeapWordsPerLong 
boundary. Since the argument is in words, there is no concern with my 
changes removing word alignment of something that is not already word 
aligned. It must already be word aligned or the current implementation 
would be broken.

Since HeapWordsPerLong is 1 on 64-bit, the end result is that 
align_object_offset() is a no-op, so the removal is having no impact on 
64-bit.

On 32-bit HeapWordsPerLong is 2, so the end result is that the offset 
will remain 32-bit word aligned, and not be 64-bit aligned. This is in 
fact the goal of this change, so what remains is to show that 64-bit 
alignment of the fields is not needed on 32-bit. Since all of the fields 
for which alignment has been removed are 32-bit types, it is safe to 
keep them 32-bit word aligned instead of making them 64-bit aligned.

thanks,

Chris



On 12/4/15 2:02 PM, Chris Plummer wrote:
> Hello,
>
> Please review the following:
>
> https://bugs.openjdk.java.net/browse/JDK-8143608
> http://cr.openjdk.java.net/~cjplummer/8143608/webrev.00/webrev.hotspot/
>
> A bit of background would help. The InstanceKlass object has a number 
> of variable length fields that are laid out after the declared fields. 
> When an InstanceKlass object is allocated, extra memory is allocated 
> for it to leave room for these fields. The first three of these fields 
> are vtable, itable, and nonstatic_oopmap. They are all arrays of 
> HeapWord sized values, which means void* size, which means they only 
> need 32-bit alignment on 32-bit systems. However, they have always 
> been 64-bit aligned. This webrev removes the forced 64-bit alignment 
> on 32-bit systems, saving footprint.
>
> This change affects all 32-bit platforms. It should have no net impact 
> on 64-bit platforms since the fields remain (naturally) 64-bit aligned 
> (unless of course I've introduced a bug). The intent is to not change 
> what is done for 64-bit platforms.
>
> BTW, there is a change to AARCH64, which may seem odd at first. It 
> just removes an "if" block where the condition should always have 
> evaluated to false, so it should have no net affect.
>
> Tested with JPRT "-testset hotspot". Please let me know if you think 
> there are any additional tests that should be run.
>
> thanks,
>
> Chris
>



More information about the hotspot-runtime-dev mailing list