RFR JDK-8059510 Compact symbol table layout inside shared archive
Jiangli Zhou
jiangli.zhou at oracle.com
Sat Dec 6 00:44:35 UTC 2014
Hi John,
Thank you for the feedback. And thank you again for all the great
suggestions!
On 12/05/2014 02:15 PM, John Rose wrote:
> On Dec 4, 2014, at 2:17 PM, Ioi Lam <ioi.lam at oracle.com
> <mailto:ioi.lam at oracle.com>> wrote:
>>
>>>>> 163 *p++ = juint(base_address >> 32);
>>>>> 167 *p++ = juint(base_address & 0xffffffff);
>>>>>
>>>>> 205 juint upper = *p++;
>>>>> 206 juint lower = *p++;
>>>>> 208 _base_address = (uintx(upper) << 32 ) + uintx(lower);
>>>>>
>>>>
>>>> Actually it would have problem on 32-bit platforms. The behaviour
>>>> of shift by greater than or equal to the number of bits that exist
>>>> in the operand is undefined. Gcc gives warning about the >>32 on
>>>> linux-x86.
>
> The use of "raw constants" 32 and 0xffffffff is an anti-pattern, a
> clue that something better can be done.
> https://wiki.openjdk.java.net/display/HotSpot/StyleGuide#StyleGuide-NamedCons
>
> In this case, we can get safer, more portable code by using functions
> from globalDefinitions.hpp. Let's use those functions when they are
> available, instead of raw, manual C shift operators.
>
> 163 *p++ = high(base_address);
> 167 *p++ = low(base_address);
>
> 205 juint upper = *p++;
> 206 juint lower = *p++;
> 208 _base_address = jlong_from(upper, lower);
Good to know there are existing APIs. I'll change to use those.
>
> The statistics on bucket size are very interesting. It's particularly
> interesting (a little surprising to me) that reducing average bucket
> size below 4 doesn't seem to help performance. That suggests that
> cache line scale (bucket of size four "just happens" to be 64 bytes =
> x86 cache line) dominates the performance.
>
> In that case, and given that length=1 is only 6% of buckets, I think
> we could drop the special 'COMPACT_BUCKET_TYPE'.
I wonder if it would help more when we also add the support for string
table. With a lower hash table load factor, the percentage of buckets
with one entry increases. I'm inclined to leave it in if there is no
strong objection.
>
> Getting rid of the bucket length table is good progress. A standard
> trick for this kind of "differential" data structure is to regularize
> the code by duplicating the value in _table_end_offset at the end of
> the _buckets array at _buckets[_bucket_count]. Then you won't need
> the extra check "if (index == int(_bucket_count - 1))".
That's a good trick. I'll make the change.
Thanks!
Jiangli
>
> — John
More information about the hotspot-runtime-dev
mailing list