Request for review: 7168280: Eliminate the generic signature index slot from field array for field without generic signature
Jiangli Zhou
jiangli.zhou at oracle.com
Mon May 14 10:48:33 PDT 2012
Hi Dean,
Thanks for the further comments.
On 05/11/2012 06:32 PM, Dean Long wrote:
> How about using a typeArrayOop as your temporary storage in
> parse_fields() instead of a u2 array? That way you can use the
> existing from_field_array() that does a bounds check.
Several approaches were attempted for parse_fields(). Initially a
typeArrayOop was used. However measurements indicated memory increase
instead of reduction with the approach. The temporary allocated
typeArrayOops were not being GC'ed and caused memory leaks. As a second
approach, the number of fields with generic signature was counted first
so a typeArrayOop was allocated with the exact size. That approached
required an extra iteration of all fields. The temporary resource array
approach avoids the pre-parsing of all fields and also does not have
memory leak.
>
> It is unfortunate that FieldInfo can't get generic signature
> information anymore, forcing you to move more logic into the callers.
Fortunately most of the logic are hidden in the fieldStreams.
>
> Some of the code that iterates through all the fields could be more
> efficient if you still had all_fields_count() so you could easily find
> the generic signature information at the end. One way to do that is
> to store the total fields count at the end of the array only if the
> array contains generic signature information. You can tell if the
> array contains generic signature information by the length. If the
> length % FieldInfo::field_slots == 0, then there is no generic
> signature information, and all_fields_count() is computed like
> before. If length % FieldInfo::field_slots != 0 then get the fields
> count from the end of the array. You would need to pad the array with
> an extra slot if the number of generic signature slots happened to be
> a multiple of FieldInfo::field_slots.
I considered of recording the field count in the array. However it still
uses extra 2 bytes for each class. I also played with the idea of using
length % FieldInfo::field_slots as indicator of the existence of generic
signatures. But if the number of fields is the multiply of
FieldInfo::field_slots, length % FieldInfo::field_slots can be 0 if all
fields have generic signatures.
I did some performance measurements with the field array changes. There
seems no performance degradation.
==============================================================================
logs.field_baseline.1:
Benchmark Samples Mean Stdev Geomean
Weight
specjbb2005 8 56057.48 454.04
specjvm98 8 533.28 17.25
==============================================================================
logs.field.2:
Benchmark Samples Mean Stdev %Diff P
Significant
specjbb2005 8 56321.18 614.18 0.47
0.347 *
specjvm98 8 537.81 11.07 0.85
0.544 *
==============================================================================
Thanks again for the review and comments. Can I count you as a reviewer?
Jiangli
>
> dl
>
> On 5/11/2012 2:43 PM, Jiangli Zhou wrote:
>> Hi Dean,
>>
>> Here is the updated webrev
>> http://cr.openjdk.java.net/~jiangli/7168280/webrev.01/. In
>> init_generic_signature_start_slot(), it first scans from f[0] to
>> f[_index - 1] so the generic signature slots for those fields can be
>> skipped while scanning from f[_index] to the end.
>>
>> Thanks again,
>>
>> Jiangli
>>
>> On 05/11/2012 01:53 PM, Jiangli Zhou wrote:
>>> Hi Dean,
>>>
>>> Good catch! Thanks for the comments.
>>>
>>> Jiangli
>>>
>>> On 05/11/2012 01:38 PM, Dean Long wrote:
>>>> I think this breaks InternalFieldStream. The loop in
>>>> init_generic_signature_start_slot() will start at
>>>> java_fields_count() instead of 0, so it won't decrement "length"
>>>> for any Java fields with a generic signature, resulting in scanning
>>>> too many elements.
>>>>
>>>> dl
>>>>
>>>> On 5/11/2012 12:02 PM, Jiangli Zhou wrote:
>>>>> Hi,
>>>>>
>>>>> The field array is an array of 7-shorts [access, name index, sig
>>>>> index, initval index, low offset, high offset, generic signature
>>>>> index]. Most fields don't have generic signature attribute, in
>>>>> that case the generic signature index in the field array is 0 and
>>>>> unused. For all classes in rt.jar, there are total about 28973
>>>>> fields. From which 27466 fields do not have generic signature and
>>>>> only 1507 fields have generic signature.
>>>>>
>>>>> Following is a webrev that eliminates the unused generic signature
>>>>> index slot from field array. For field without generic signature,
>>>>> the field data is 6-shorts. For field with generic signature, it
>>>>> is still 7-shorts of data. A new flag is added in the field access
>>>>> flag to indicate if the field has the extra short for generic
>>>>> signature index.
>>>>>
>>>>> http://cr.openjdk.java.net/~jiangli/7168280/webrev.00/
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Jiangli
>>>
>>
More information about the hotspot-runtime-dev
mailing list