RFR: 8130115: REDO - Reduce Symbol::_identity_hash to 2 bytes
Yumin Qi
yumin.qi at oracle.com
Tue Jul 28 04:57:06 UTC 2015
Thanks for your suggestion, that is good to cover the concern. I will
factor a test case for it.
Yumin
On 7/27/2015 9:29 PM, Ioi Lam wrote:
> Hi Yumin,
>
> The C code changes look good to me.
>
> I am a little concerned about the Java code's calculation of
> identityHash:
>
> Java version:
> 86 public int identityHash() {
> 87 long addr_value = getAddress().asLongValue();
> 88 int addr_bits = (int)(addr_value >>
> (VM.getVM().getLogMinObjAlignmentInBytes() + 3));
> 89 int length = (int)getLength();
> 90 int byte0 = getByteAt(0);
> 91 int byte1 = getByteAt(1);
> 92 int id_hash = (int)(0xffff & idHash.getValue(this.addr));
> 93 return id_hash |
> 94 ((addr_bits ^ (length << 8) ^ ((byte0 << 8) | byte1))
> << 16);
> 95 }
>
> C version:
> 148 unsigned identity_hash() {
> 149 unsigned addr_bits = (unsigned)((uintptr_t)this >>
> (LogMinObjAlignmentInBytes + 3));
> 150 return (unsigned)_identity_hash |
> 151 ((addr_bits ^ (_length << 8) ^ (( _body[0] << 8) |
> _body[1])) << 16);
> 152 }
>
> The main problem is to correctly emulate the C unsigned operations in
> the Java code. I've eyeballed the code and it seems correct, but I am
> wondering if you have actually tested and verified that the Java
> version indeed returns the same value as the C code? A unit test case
> would be good:
>
> * Add a new test in hotspot/agent/test
> * Get a few Symbols (e.g., call
> sun.jvm.hotspot.runtime.VM.getSymbolTable and iterate over the first
> 1000 Symbols)
> * For each Symbol, call its Symbol.identityHash() method
> * Add a new whitebox API to return the C version of the
> identity_hash() value
> * Check if the C value is the same as the Java value
>
> Please run the test on all platforms (both 32-bit and 64-bit, and all
> OSes).
>
> Thanks
> - Ioi
>
>
> On 7/15/15 10:37 AM, Yumin Qi wrote:
>> Hi,
>>
>> This is redo for bug 8087143, in that push, it caused failure on
>> Serviceability Agent failed to get type for "_identity_hash":
>> mistakenly used JShortField for it, but in fact it still is
>> CIntegerField. In this change, besides of the original change in
>> hotspot/src, I add code to calculate identity_hash in hotspot/agent
>> based on the changed in hotspot.
>>
>> Old webrev for 8087143:
>> bug: https://bugs.openjdk.java.net/browse/JDK-8087143
>> webrev: http://cr.openjdk.java.net/~minqi/8087143/webrev03/
>>
>> 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.
>>
>> New webrev for 8130115:
>> bug: https://bugs.openjdk.java.net/browse/JDK-8130115
>> webrev: http://cr.openjdk.java.net/~minqi/8130115/webrev01/
>>
>>
>> Tests: JPRT, SA manual tests, -atk quick, jtreg hotspot/runtime
>> Also internal large application used for hashtable data analysis ---
>> the No. of loaded classes is big(over 19K), and tested with different
>> bucket sizes including over 65535 to see the new algorithm for
>> identity_hash calculation, result shows the consistency before and
>> after the fix.
>>
>> Thanks
>> Yumin
>
More information about the hotspot-runtime-dev
mailing list