Ioi,

I am trying to add a test case in SA for the testing as you mentioned. The easy part is adding a simple SA Tool (SymbolsInfo.java) to get the Symbol information but encountered a problem as:

In the testing java process (1), create (spawn) another java process(2), which will run SA (SymbolsInfo) and attach back to the process (1). It failed due to time out waiting for response from target(1). I am investigating and trying to find a solution. It may have issue for such case.

Webrev (Note: in the webrev, WhitBox.java, white_box.cpp, SymbolsInfo.java and IdentityHashForSymbols.java added to previous version webrev01)

  http://cr.openjdk.java.net/~minqi/8130115/webrev02/

  Any one has comments how to solve the problem?
Following are the two processes, you can see process 2) has parent as process 1): ($WS, $TEST are for real locations on my host machine)

1) 25939 25807 19 09:32 pts/1 00:00:00 $MYJDK/bin/java -Dtest.src=$WS/hotspot/test/serviceability/sa -Dtest.src.path=$WS/hotspot/test/serviceability/sa:$WS/hotspot/test/testlibrary:$WS/test/lib -Dtest.classes=$TEST/JTwork/classes/serviceability/sa -Dtest.class.path=$TEST/JTwork/classes/serviceability/sa:$TEST/JTwork/classes/testlibrary:$TEST/test/lib -Dtest.vm.opts= -Dtest.tool.vm.opts= -Dtest.compiler.opts= -Dtest.java.opts= -Dtest.jdk=$MYJDK -Dcompile.jdk=$MYJDK -Dtest.timeout.factor=1.0 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI com.sun.javatest.regtest.agent.MainWrapper $TEST/JTwork/classes/serviceability/sa/IdentityHashForSymbols.jta

2) 25976 25939 63 09:32 pts/1 00:00:03 $MYJDK/bin/java -cp $TEST/jtreg/lib/javatest.jar:$TEST/jtreg/lib/jtreg.jar:$TEST/JTwork/classes/serviceability/sa:$WS/hotspot/test/serviceability/sa:$TEST/JTwork/classes/testlibrary:$TEST/test/lib sun.jvm.hotspot.tools.SymbolsInfo 25939


Thanks
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


Reply via email to