Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解释实例';什么是标记词?_Java_Jvm Hotspot_Object Layout_Jol_Biased Locking - Fatal编程技术网

Java 如何解释实例';什么是标记词?

Java 如何解释实例';什么是标记词?,java,jvm-hotspot,object-layout,jol,biased-locking,Java,Jvm Hotspot,Object Layout,Jol,Biased Locking,我试图理解64位HotSpot VM(v8)上的输出。我不明白是如何使用的,根据链接类文件中的注释,应该指出是在实例上设置了有偏锁还是无偏锁 当我使用JOL by分析对象的实例时 ClassLayout layout = ClassLayout.parseClass(Object.class); Object object = new Object(); System.out.println(layout.toPrintable(object)); 我得到以下输出: java.lang.Obj

我试图理解64位HotSpot VM(v8)上的输出。我不明白是如何使用的,根据链接类文件中的注释,应该指出是在实例上设置了有偏锁还是无偏锁

当我使用JOL by分析
对象的实例时

ClassLayout layout = ClassLayout.parseClass(Object.class);
Object object = new Object();
System.out.println(layout.toPrintable(object));
我得到以下输出:

java.lang.Object object internals:
 OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
      0     4       (object header)                01 00 00 00 (0000 0001 0000 0000 0000 0000 0000 0000)
      4     4       (object header)                00 00 00 00 (0000 0000 0000 0000 0000 0000 0000 0000)
      8     4       (object header)                e5 01 00 f8 (1110 0101 0000 0001 0000 0000 1111 1000)
     12     4       (loss due to the next object alignment)
Instance size: 16 bytes (estimated, add this JAR via -javaagent: to get accurate result)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
根据(前8个字节),我理解我应该解释输出的上述位范围,如下所示:

  • 00:01
    -锁定标志(示例中为
    00
  • 02:02
    -偏置锁的标志(示例中为
    0
  • 03:06
    -年龄与年轻的垃圾收集迭代次数相同。(
    0000
    示例中。)
  • 07:07
    -未使用。(似乎总是
    1
  • 08:39
    -标识哈希代码。(仅在计算之后,在填充零之前。)
  • 40:63
    -未使用。(似乎用零填充。)
确认哈希代码范围的布局

至少对于散列码,这可以通过计算标识散列码和比较值来容易地确认:

ClassLayout layout = ClassLayout.parseClass(Object.class);
Object object = new Object();
// Check that the hash code is not set.
System.out.println(layout.toPrintable(object));

System.out.println("hash code: 0x" + Integer.toHexString(object.hashCode()));
// Confirm that the value is set:
System.out.println(layout.toPrintable(object));

// Compute the hash code manually:
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
long hashCode = 0;
for (long index = 7; index > 0; index--) {
  hashCode |= (unsafe.getByte(object, index) & 0xFF) << ((index - 1) * 8);
}
System.out.println("hash code: 0x" + Long.toHexString(hashCode));
初始锁定后,偏置锁定在标记字中可见,如下所示:

java.lang.Object object internals:
 OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
      0     4       (object header)                05 f0 3f 02 (0000 0101 1111 0000 0011 1111 0000 0010)
      4     4       (object header)                00 00 00 00 (0000 0000 0000 0000 0000 0000 0000 0000)
      8     4       (object header)                e5 01 00 f8 (1110 0101 0000 0001 0000 0000 1111 1000)
     12     4       (loss due to the next object alignment)
Instance size: 16 bytes (estimated, add this JAR via -javaagent: to get accurate result)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
一旦调用
object.hashCode()
,我就可以验证这不代表哈希代码,因为标记字会发生变化(偏置锁被撤销)


我不明白的是,偏置锁和非偏置锁的标志仍然设置为零。HotSpot如何知道这是一个有偏锁,而不是对象中表示的哈希代码。另外,我想知道:历元位表示什么?

答案很简单:OpenJDK的注释已经过时,而mark word今天的组织方式也不同。

您说您正在运行HotSpot 8,但您正在链接JDK 6的源代码。
java.lang.Object object internals:
 OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
      0     4       (object header)                05 f0 3f 02 (0000 0101 1111 0000 0011 1111 0000 0010)
      4     4       (object header)                00 00 00 00 (0000 0000 0000 0000 0000 0000 0000 0000)
      8     4       (object header)                e5 01 00 f8 (1110 0101 0000 0001 0000 0000 1111 1000)
     12     4       (loss due to the next object alignment)
Instance size: 16 bytes (estimated, add this JAR via -javaagent: to get accurate result)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total