RFR(S): 8087143: Reduce Symbol::_identity_hash to 2 bytes

Coleen Phillimore coleen.phillimore at oracle.com
Fri Jun 19 18:21:26 UTC 2015


Hi,  This is okay, one comment below.

On 6/19/15 12:21 PM, Yumin Qi wrote:
> Coleen,
>
>   Thanks.
>
> On 6/19/2015 5:14 AM, Coleen Phillimore wrote:
>>
>> Yumin,
>>
>> If the identity hash isn't unique enough you get a system dictionary 
>> warning like this, which doesn't stop the JVM. Could you check your 
>> test logs to see if this warning is output in any of them (jtreg 
>> keeps logs around, just checking the jtreg test results should be 
>> sufficient, I think).
>>
>> Log : HotSpot(TM) Server VM warning: Performance bug: 
>> SystemDictionary lookup_count=6918 lookup_length=3907 
>> average=0.564759 load=0.266601
>>
>> I think with including _body[0] in the function you may make the hash 
>> random enough.   So this was one of my concerns with this change.
>>
> I will check that.
>> In 
>> http://cr.openjdk.java.net/~minqi/8087143/webrev01/src/share/vm/runtime/java.cpp.udiff.html
>>
>> Are you sure you want all of the SymbolTable dump?  Maybe it should 
>> be under PrintSymbolTableSizeStatistics instead?
>>
> I will check and make change based on the output of statistics, maybe 
> it is too much to print out all SymbolTable.

It's way more than anyone needs normally.   Maybe only print it if one 
adds +Verbose to PrintStringTableSizeStatistics and when we do logging, 
it'll be -Xlog:symboltable=trace or a lower logging level than info.

Thanks,
Coleen
>> In 
>> http://cr.openjdk.java.net/~minqi/8087143/webrev01/src/share/vm/oops/symbol.hpp.udiff.html
>>
>> -// We separate the fields in SymbolBase from Symbol::_body so that
>> -// Symbol::size(int) can correctly calculate the space needed.
>>
>> I'm not sure what that comment meant.  With SymbolBase gone (which I 
>> think looks nicer), can you still correctly calculate the space needed?
>>
> Yes, now the _body changed from 1 byte array to 2 bytes array.
> The original calculation is not correct I think:  if symbol length > 
> 0, we allocate *_ONE_* extra byte for it:
> -    size_t sz = heap_word_size(sizeof(SymbolBase) + (length > 0 ? length : 0));
> +    size_t sz = heap_word_size(sizeof(Symbol) + (length > 2 ? length - 2 : 0));
>
>> Other than these things, this change looks good.  Nice to find some 
>> space savings with something so frequent as symbols.
>>
>> Thanks,
>> Coleen
>>
>> On 6/18/15 8:40 PM, Yumin Qi wrote:
>>> Ioi,
>>>
>>>   Thanks for review, I will add that (for print out purpose, not in 
>>> the final change?)
>>>
>>> Yumin
>>>
>>> On 6/18/2015 3:34 PM, ioi.lam at oracle.com wrote:
>>>> Hi Yumin,
>>>>
>>>> I wonder why the average symbol size didn't change. They are both 
>>>> about 34.25 bytes long.
>>>>
>>>> When I tested the change, -Xshare:dump -XX:+PrintSharedSpaces show 
>>>> about 1.3 bytes reduction per symbol.
>>>>
>>>> Also, could you add some code to print out the statistics of the 
>>>> system dictionary to show if there's any change in the hashtable 
>>>> balance?
>>>>
>>>> Thanks
>>>>
>>>>> On Jun 18, 2015, at 1:46 PM, Yumin Qi <yumin.qi at oracle.com> wrote:
>>>>>
>>>>> Please review the small change for
>>>>>
>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8087143
>>>>> webrev: http://cr.openjdk.java.net/~minqi/8087143/webrev01/
>>>>>
>>>>> Summary: _identity_hash is an integer in Symbol (SymbolBase), it 
>>>>> is used to compute hash bucket index by modulus division of table 
>>>>> size. Currently in hotspot, no table size is more than 65535 so we 
>>>>> can use short instead.  For case with table size over 65535 we can 
>>>>> use the first two bytes of symbol data to be as the upper 16 bits 
>>>>> for the calculation but rare cases.
>>>>>
>>>>> This is a minor change, also eliminates SymbolBase which seems 
>>>>> redundant.  Also add print out SymbolTable statistics under debug 
>>>>> flag PrintSystemDictionaryAtExit.
>>>>>
>>>>> Tests: JPRT, Specjbb2005.
>>>>>
>>>>> The SymbolTable statistics for specjbb2005:
>>>>>
>>>>> Before Change:
>>>>> SymbolTable statistics:
>>>>> Number of buckets       :     20011 =    320176 bytes, avg 16.000
>>>>> Number of entries       :     49914 =   1597248 bytes, avg 32.000
>>>>> Number of literals      :     49914 =   1709688 bytes, avg 34.253
>>>>> Total footprint         :           =   3627112 bytes
>>>>> Average bucket size     :     2.494
>>>>> Variance of bucket size :     2.483
>>>>> Std. dev. of bucket size:     1.576
>>>>> Maximum bucket size     :        10
>>>>>
>>>>> After Change:
>>>>>
>>>>> SymbolTable statistics:
>>>>> Number of buckets       :     20011 =    320176 bytes, avg 16.000
>>>>> Number of entries       :     49911 =   1597152 bytes, avg 32.000
>>>>> Number of literals      :     49911 =   1709544 bytes, avg 34.252
>>>>> Total footprint         :           =   3626872 bytes
>>>>> Average bucket size     :     2.494
>>>>> Variance of bucket size :     2.483
>>>>> Std. dev. of bucket size:     1.576
>>>>> Maximum bucket size     :        10
>>>>>
>>>>> There is no big change for the hashtable balance.
>>>>>
>>>>>
>>>>> Thanks
>>>>> Yumin
>>>
>>
>



More information about the hotspot-runtime-dev mailing list