RFR 8041565: JMX ObjectName could be refactored to save memory
Jaroslav Bachorik
jaroslav.bachorik at oracle.com
Mon Apr 13 15:07:30 UTC 2015
Hi Roger,
On 13.4.2015 16:07, Roger Riggs wrote:
> Hi Jaroslav,
>
> Minor comments:
>
> 1488+: In forms like:
>
> _pattern_flag &= (~PROPLIST_PATTERN & 0xff);"
>
> The &0xff seems unnecessary since the store is to a byte field.
Fixed: http://cr.openjdk.java.net/~jbachorik/8041565/webrev.01
>
> 1644: the ? and : operators should be surrounded by spaces.
>
> There are other style issues, such as then statements on the same line
> as the 'if' but that
> may be beyond the scope of this change.
I know but these style issue have been around since the file was first
committed. I didn't address them because it didn't feel right to mix
style changes with the actual functionality.
Cheers,
-JB-
>
> Otherwise looks fine (as a 9 reviewer, but not specifically a
> serviceability reviewer).
>
> Thanks, Roger
>
>
> On 4/13/2015 5:43 AM, Jaroslav Bachorik wrote:
>> Please, review the following change
>>
>> Issue : https://bugs.openjdk.java.net/browse/JDK-8041565
>> Webrev: http://cr.openjdk.java.net/~jbachorik/8041565/webrev.00
>>
>> In situations when there are 10s of thousands ObjectNname instances
>> around (enterprise setups etc.) the 3 separate internal boolean fields
>> can lead to a noticeable memory waste. Adding insult to the injury,
>> with the current field layout it is necessary to align the instances
>> by 4 bytes.
>>
>> When using JOL (http://openjdk.java.net/projects/code-tools/jol/) to
>> inspect the object layout we can see this:
>>
>> Before optimization (JDK8u40):
>> ---
>> javax.management.ObjectName object internals:
>> OFFSET SIZE TYPE DESCRIPTION VALUE
>> 0 12 (object header)| N/A
>> 12 4 int ObjectName._domain_length N/A
>> 16 1 boolean ObjectName._domain_pattern N/A
>> 17 1 boolean ObjectName._property_list_pattern N/A
>> 18 1 boolean ObjectName._property_value_pattern N/A
>> 19 1 (alignment/padding gap) N/A
>> 20 4 String ObjectName._canonicalName N/A
>> 24 4 Property[] ObjectName._kp_array N/A
>> 28 4 Property[] ObjectName._ca_array N/A
>> 32 4 Map ObjectName._propertyList N/A
>> 36 4 (loss due to the next object alignment)
>> Instance size: 40 bytes (estimated, the sample instance is not available)
>> Space losses: 1 bytes internal + 4 bytes external = 5 bytes total
>> {noformat}
>>
>> After optimization (JDK9 internal build):
>> ---
>>
>> javax.management.ObjectName object internals:
>> OFFSET SIZE TYPE DESCRIPTION VALUE
>> 0 12 (object header) N/A
>> 12 2 short ObjectName._domain_length N/A
>> 14 1 byte ObjectName._pattern_flag N/A
>> 15 1 (alignment/padding gap) N/A
>> 16 4 String ObjectName._canonicalName N/A
>> 20 4 Property[] ObjectName._kp_array N/A
>> 24 4 Property[] ObjectName._ca_array N/A
>> 28 4 Map ObjectName._propertyList N/A
>> Instance size: 32 bytes (estimated, the sample instance is not available)
>> Space losses: 1 bytes internal + 0 bytes external = 1 bytes total
>>
>>
>> After optimization we can save 8 bytes per instance which can
>> translate to very interesting numbers on large installations.
>>
>>
>> To achieve this the domain name length is set to be *short* instead of
>> *int* and the three booleans kept for the performance purposes are
>> encoded into one byte value (as proposed by the reporter,
>> Jean-Francois Denise).
>>
>> All the regression and JCK tests are passing after this change.
>>
>>
>> Thanks,
>>
>> -JB-
>
More information about the serviceability-dev
mailing list