What's the default hash value of an object on 64 bit JVM

后端 未结 5 1682
慢半拍i
慢半拍i 2020-12-17 07:40

Since default hash value of an object is the object address of the object, on 32-bit machine, it makes sense considering hash value is an int value. My question is that on 6

5条回答
  •  被撕碎了的回忆
    2020-12-17 07:45

    In the OpenJDK/HotSpot JVM you can obtain the raw index address of a reference. This translates to a 32-bit address for a small heap and a 64-bit address for a large heap. For medium sized heaps, 32-bit Compressed OOPS are used.

    The implementation is available in synchronizer.cpp AFAIK, the last implementation is the one actually used.

    /**
     * Prints the addresses and hashCode()s of the first objects in eden space.
     * 

    * Assumes a 32-bit address space e.g. CompressOops *

    */ public static void main(String... ignored) throws Exception { Object[] objects = new Object[8]; for (int i = 0; i < 20; i++) { System.gc(); for (int j = 0; j < objects.length; j++) { objects[j] = new Object(); } for (int j = 0; j < objects.length; j++) { long address = OBJECT_SCALE == 4 ? UNSAFE.getInt(objects, OBJECT_BASE + j * OBJECT_SCALE) & 0xFFFFFFFFL : UNSAFE.getLong(objects, OBJECT_BASE + j * OBJECT_SCALE); System.out.printf("%,d: addr: %8x, hc: %8x ", j, address, objects[j].hashCode()); } System.out.println(); } } static final Unsafe UNSAFE; static final int OBJECT_BASE, OBJECT_SCALE; static { try { Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); UNSAFE = (Unsafe) theUnsafe.get(null); OBJECT_BASE = UNSAFE.arrayBaseOffset(Object[].class); OBJECT_SCALE = UNSAFE.arrayIndexScale(Object[].class); } catch (Exception e) { throw new AssertionError(e); } }

    prints

    0: addr: fc000000, hc: 6d6f6e28 1: addr: fc000001, hc: 29453f44 2: addr: fc000002, hc: 5cad8086 3: addr: fc000003, hc: 6e0be858 4: addr: fc000004, hc: 61bbe9ba 5: addr: fc000005, hc: 610455d6 6: addr: fc000006, hc: 511d50c0 7: addr: fc000007, hc: 60e53b93 
    0: addr: fc000000, hc: 5e2de80c 1: addr: fc000001, hc: 1d44bcfa 2: addr: fc000002, hc: 266474c2 3: addr: fc000003, hc: 6f94fa3e 4: addr: fc000004, hc: 5e481248 5: addr: fc000005, hc: 66d3c617 6: addr: fc000006, hc: 63947c6b 7: addr: fc000007, hc: 2b193f2d 
    0: addr: fc000000, hc: 355da254 1: addr: fc000001, hc: 4dc63996 2: addr: fc000002, hc:  d716361 3: addr: fc000003, hc: 6ff3c5b5 4: addr: fc000004, hc: 3764951d 5: addr: fc000005, hc: 4b1210ee 6: addr: fc000006, hc: 4d7e1886 7: addr: fc000007, hc: 3cd1a2f1 
    0: addr: fc000000, hc: 2f0e140b 1: addr: fc000001, hc: 7440e464 2: addr: fc000002, hc: 49476842 3: addr: fc000003, hc: 78308db1 4: addr: fc000004, hc: 27c170f0 5: addr: fc000005, hc: 5451c3a8 6: addr: fc000006, hc: 2626b418 7: addr: fc000007, hc: 5a07e868 
    0: addr: fc000000, hc: 76ed5528 1: addr: fc000001, hc: 2c7b84de 2: addr: fc000002, hc: 3fee733d 3: addr: fc000003, hc: 5acf9800 4: addr: fc000004, hc: 4617c264 5: addr: fc000005, hc: 36baf30c 6: addr: fc000006, hc: 7a81197d 7: addr: fc000007, hc: 5ca881b5 
    0: addr: fc000000, hc: 24d46ca6 1: addr: fc000001, hc: 4517d9a3 2: addr: fc000002, hc: 372f7a8d 3: addr: fc000003, hc: 2f92e0f4 4: addr: fc000004, hc: 28a418fc 5: addr: fc000005, hc: 5305068a 6: addr: fc000006, hc: 1f32e575 7: addr: fc000007, hc: 279f2327 
    0: addr: fc000000, hc: 2ff4acd0 1: addr: fc000001, hc: 54bedef2 2: addr: fc000002, hc: 5caf905d 3: addr: fc000003, hc:  27716f4 4: addr: fc000004, hc:  8efb846 5: addr: fc000005, hc: 2a84aee7 6: addr: fc000006, hc:  a09ee92 7: addr: fc000007, hc: 30f39991 
    0: addr: fc000000, hc: 452b3a41 1: addr: fc000001, hc: 4a574795 2: addr: fc000002, hc:  f6f4d33 3: addr: fc000003, hc: 23fc625e 4: addr: fc000004, hc: 3f99bd52 5: addr: fc000005, hc: 4f023edb 6: addr: fc000006, hc: 3a71f4dd 7: addr: fc000007, hc: 7adf9f5f 
    0: addr: fc000000, hc:  85ede7b 1: addr: fc000001, hc: 5674cd4d 2: addr: fc000002, hc: 63961c42 3: addr: fc000003, hc: 65b54208 4: addr: fc000004, hc: 1be6f5c3 5: addr: fc000005, hc: 6b884d57 6: addr: fc000006, hc: 38af3868 7: addr: fc000007, hc: 77459877 
    0: addr: fc000000, hc: 5b2133b1 1: addr: fc000001, hc: 72ea2f77 2: addr: fc000002, hc: 33c7353a 3: addr: fc000003, hc: 681a9515 4: addr: fc000004, hc: 3af49f1c 5: addr: fc000005, hc: 19469ea2 6: addr: fc000006, hc: 13221655 7: addr: fc000007, hc: 2f2c9b19 
    0: addr: fc000000, hc: 31befd9f 1: addr: fc000001, hc: 1c20c684 2: addr: fc000002, hc: 1fb3ebeb 3: addr: fc000003, hc: 548c4f57 4: addr: fc000004, hc: 1218025c 5: addr: fc000005, hc:  816f27d 6: addr: fc000006, hc:  87aac27 7: addr: fc000007, hc: 3e3abc88 
    0: addr: fc000000, hc: 6ce253f1 1: addr: fc000001, hc: 53d8d10a 2: addr: fc000002, hc:  e9e54c2 3: addr: fc000003, hc: 65ab7765 4: addr: fc000004, hc: 1b28cdfa 5: addr: fc000005, hc:  eed1f14 6: addr: fc000006, hc: 7229724f 7: addr: fc000007, hc: 4c873330 
    0: addr: fc000000, hc: 119d7047 1: addr: fc000001, hc: 776ec8df 2: addr: fc000002, hc: 4eec7777 3: addr: fc000003, hc: 3b07d329 4: addr: fc000004, hc: 41629346 5: addr: fc000005, hc: 404b9385 6: addr: fc000006, hc: 6d311334 7: addr: fc000007, hc: 682a0b20 
    0: addr: fc000000, hc: 3d075dc0 1: addr: fc000001, hc: 214c265e 2: addr: fc000002, hc: 448139f0 3: addr: fc000003, hc: 7cca494b 4: addr: fc000004, hc: 7ba4f24f 5: addr: fc000005, hc: 3b9a45b3 6: addr: fc000006, hc: 7699a589 7: addr: fc000007, hc: 58372a00 
    0: addr: fc000000, hc:  4dd8dc3 1: addr: fc000001, hc: 6d03e736 2: addr: fc000002, hc: 568db2f2 3: addr: fc000003, hc: 378bf509 4: addr: fc000004, hc: 5fd0d5ae 5: addr: fc000005, hc: 2d98a335 6: addr: fc000006, hc: 16b98e56 7: addr: fc000007, hc: 7ef20235 
    0: addr: fc000000, hc: 27d6c5e0 1: addr: fc000001, hc: 4f3f5b24 2: addr: fc000002, hc: 15aeb7ab 3: addr: fc000003, hc: 7b23ec81 4: addr: fc000004, hc: 6acbcfc0 5: addr: fc000005, hc: 5f184fc6 6: addr: fc000006, hc: 3feba861 7: addr: fc000007, hc: 5b480cf9 
    0: addr: fc000000, hc: 6f496d9f 1: addr: fc000001, hc: 723279cf 2: addr: fc000002, hc: 10f87f48 3: addr: fc000003, hc:  b4c966a 4: addr: fc000004, hc: 2f4d3709 5: addr: fc000005, hc: 4e50df2e 6: addr: fc000006, hc: 1d81eb93 7: addr: fc000007, hc: 7291c18f 
    0: addr: fc000000, hc: 34a245ab 1: addr: fc000001, hc: 7cc355be 2: addr: fc000002, hc: 6e8cf4c6 3: addr: fc000003, hc: 12edcd21 4: addr: fc000004, hc: 34c45dca 5: addr: fc000005, hc: 52cc8049 6: addr: fc000006, hc: 5b6f7412 7: addr: fc000007, hc: 27973e9b 
    0: addr: fc000000, hc: 312b1dae 1: addr: fc000001, hc:  7530d0a 2: addr: fc000002, hc: 27bc2616 3: addr: fc000003, hc: 3941a79c 4: addr: fc000004, hc: 506e1b77 5: addr: fc000005, hc: 4fca772d 6: addr: fc000006, hc:  9807454 7: addr: fc000007, hc: 3d494fbf 
    0: addr: fc000000, hc: 1ddc4ec2 1: addr: fc000001, hc:  133314b 2: addr: fc000002, hc:  b1bc7ed 3: addr: fc000003, hc: 7cd84586 4: addr: fc000004, hc:  30dae81 5: addr: fc000005, hc: 1b2c6ec2 6: addr: fc000006, hc: 4edde6e5 7: addr: fc000007, hc: 70177ecd 
    

    For CompressedOops and heaps between 3-30 GB, it gives you an idea of the memory location (but it is translated) In the case above, the addresses are index * 8 The 8 comes from the allocation block size which is 8 bytes by default. It can be increased to 16 or 32 in Java 8, although using 16 is only useful for heaps of 32 - 64 GB, and 32 might not be useful at all as a 32 byte allocation size might be more expensive than using 64-bit references

    As you can see, each object was allocated in the same space after a System.gc(). The addresses are the same each time, however the hashCode

    • has little to do with the address
    • is only 31-bit, there is nothing starting 8 to F in hexadecimal.

提交回复
热议问题