精华内容
下载资源
问答
  • 对象头包括什么
    千次阅读
    2020-06-11 08:22:16

    福哥口诀法:标类长(对象头:markword标记字、klass类型指针、数组长度(仅限于数组))

    无偏轻重G(锁状态:无锁、偏向锁、轻量级锁、重量级锁、GC标记)

    未哈未年标,25 31 1 (64位无锁情况:未使用25、hashcode31、未使用1、年龄4、偏向标志1)
    线时未年标,54和2 1(64位偏向锁情况:线程id54、偏向时间戳2、未使用1、年龄4、偏向标志1)

    哈年标25 (32位无锁情况:hashcode25、年龄4、偏向标志1)
    线时年标23 2 (32位偏向锁情况:线程id23、偏向时间戳2、年龄4、偏向标志1)

    评论

    更多相关内容
  • 对象头包括什么

    2021-04-05 15:01:03
  • 对象头什么东西

    千次阅读 2020-12-23 14:12:11
    我们的头有口鼻眼耳,对象头也有一些东西,主要包含两部分:Mark Word(标记字)和Class Pointer(类指针),如果是数组对象还得再加一项Array Length(数组长度)。  对象头为啥要有这些东东?Mark Word用来标记...

    对象头,顾名思义,就是对象的头。对象是实例化出来的,实例化的前提是必须有类这个模板。举个不大恰当的例子,人类就是个类,你我他就是人类实例化出来的对象。我们的头,自然就是对象头。我们的头有口鼻眼耳,对象头也有一些东西,主要包含两部分:Mark Word(标记字)和Class Pointer(类指针),如果是数组对象还得再加一项Array Length(数组长度)。

      对象头为啥要有这些东东?Mark Word用来标记运行时信息(每个对象各不相同),Class Pointer用来指向生成该对象所在的类(认祖归宗),Array Length告诉我们数组的长度。后两项简单易懂,最复杂的是这个Mark Word了,看下JVM的markWord.hpp是怎么规定它的:

    // The markWord describes the header of an object. Bit-format of an object header (most significant first, big endian layout below):  32 bits:
    //  --------
    //             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
    //             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
    //
    //  64 bits:
    //  --------
    //  unused:25 hash:31 -->| unused_gap:1   age:4    biased_lock:1 lock:2 (normal object)
    //  JavaThread*:54 epoch:2 unused_gap:1   age:4    biased_lock:1 lock:2 (biased object)

     它说markWord描述了对象头,采用大端点表示,markWord包含了哈希码(hash)、GC分代年龄(age)、偏向锁(biased_lock)、锁状态(lock)和用来滥竽充数的间隔位(64位里那些unused开头的字段)。32位和64位机器存储这些东东的位大小各不相同。如果对象不再是普通对象(normal object),变成了一个偏向锁(biased object),那么markWord所含内容的哈希码就变成了持有锁的线程指针(JavaThread*)、偏向时间戳(epoch),其他不变。

      最后再说这个锁状态:

    //  - the two lock bits are used to describe three states: locked/unlocked and monitor.
    //
    //    [ptr             | 00]  locked             ptr points to real header on stack
    //    [header      | 0 | 01]  unlocked           regular object header
    //    [ptr             | 10]  monitor            inflated lock (header is wapped out)
    //    [ptr             | 11]  marked             used to mark an object

         00——轻量锁,存储内容是栈帧中指向锁对象的指针(ptr)

      01——无锁,至于是否偏向锁,需要再往前一位看,0:无锁,1:偏向锁。至于所存储之物,上面已提到:如果是普通对象(0),存储内容就是上哈希码、GC分代年龄;若是偏向锁(1),则是拥有锁的线程指针、偏向时间戳、对象分代年龄

      10——监视器锁(moniter),也就是重量锁,存储内容为指向锁对象的指针(ptr)

      11——GC标记

      好了,理论说完,下面举例说明:

      1、pom.xml新增jar包:

           <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.14</version>
            </dependency>
    

    2、新增测试类:

    import com.wlf.springcloudgateway.javabean.HelloWorld;
    import org.openjdk.jol.info.ClassLayout;
    
    import java.util.concurrent.TimeUnit;
    
    public class ObjectMarkWord {
    
        public static void main(String[] args) throws InterruptedException {
    
            // 实例化对象
            HelloWorld helloWorld = HelloWorld.builder().name("wlf").build();
    
            // 1、普通对象,无锁
            System.out.println("普通对象:");
            printfObjMarkWord(helloWorld);
    
            // 2、实例化数组,打印数组对象信息,无锁
            System.out.println("数组对象:");
            String[] address = new String[]{"hangzhou", "nanjing", "shenzhen"};
            printfObjMarkWord(address);
    
    
            // 3、单线程首次加锁,轻量锁
            System.out.println("轻量锁:");
            new Thread(() -> {
                synchronized (helloWorld) {
                    printfObjMarkWord(helloWorld);
                }
            }).start();
    
            TimeUnit.SECONDS.sleep(2);
    
            // 4、多个线程加锁,升级重量锁
            System.out.println("重量锁:");
            for (int i = 0; i < 2; i++) {
                new Thread(() -> {
                    synchronized (helloWorld) {
                        printfObjMarkWord(helloWorld);
                    }
                }).start();
            }
        }
    
        private static void printfObjMarkWord(Object obj) {
            System.out.println("-------------------------");
            System.out.println(ClassLayout.parseInstance(obj).toPrintable());
            System.out.println("-------------------------");
    
        }
    
    }
    import lombok.Data;
    
    @Data
    @Builder
    public class HelloWorld {
        private String name;
    }

    输出结果:

    普通对象:
    -------------------------
    com.wlf.springcloudgateway.javabean.HelloWorld object internals:
     OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
          0     4                    (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
          4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4                    (object header)                           88 49 0e 17 (10001000 01001001 00001110 00010111) (386812296)
         12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         16     8   java.lang.String HelloWorld.name                           (object)
    Instance size: 24 bytes
    Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
    
    -------------------------
    数组对象:
    -------------------------
    [Ljava.lang.String; object internals:
     OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
          0     4                    (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
          4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4                    (object header)                           20 e9 dd 16 (00100000 11101001 11011101 00010110) (383641888)
         12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         16     4                    (object header)                           03 00 00 00 (00000011 00000000 00000000 00000000) (3)
         20     4                    (alignment/padding gap)                  
         24    24   java.lang.String String;.<elements>                        N/A
    Instance size: 48 bytes
    Space losses: 4 bytes internal + 0 bytes external = 4 bytes total
    
    -------------------------
    轻量锁:
    -------------------------
    com.wlf.springcloudgateway.javabean.HelloWorld object internals:
     OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
          0     4                    (object header)                           60 f4 05 1a (01100000 11110100 00000101 00011010) (436597856)
          4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4                    (object header)                           88 49 0e 17 (10001000 01001001 00001110 00010111) (386812296)
         12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         16     8   java.lang.String HelloWorld.name                           (object)
    Instance size: 24 bytes
    Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
    
    -------------------------
    重量锁:
    -------------------------
    com.wlf.springcloudgateway.javabean.HelloWorld object internals:
     OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
          0     4                    (object header)                           ca da 66 17 (11001010 11011010 01100110 00010111) (392616650)
          4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4                    (object header)                           88 49 0e 17 (10001000 01001001 00001110 00010111) (386812296)
         12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         16     8   java.lang.String HelloWorld.name                           (object)
    Instance size: 24 bytes
    Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
    
    -------------------------
    -------------------------
    com.wlf.springcloudgateway.javabean.HelloWorld object internals:
     OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
          0     4                    (object header)                           ca da 66 17 (11001010 11011010 01100110 00010111) (392616650)
          4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4                    (object header)                           88 49 0e 17 (10001000 01001001 00001110 00010111) (386812296)
         12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         16     8   java.lang.String HelloWorld.name                           (object)
    Instance size: 24 bytes
    Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
    
    -------------------------
    
    Process finished with exit code 0

    我本机是64位的,所以markWord、class pointer、array length都是8字节:

     有锁、无锁,看标黄的00、01,是否偏向锁,看标红的那一位。同一个对象的class pointer是一致的,从标黄处也能看出来。普通对象是无锁(01)的,首次加锁后变成了轻量锁(00,为啥不是偏向锁?参见)。接着再另起两个线程竞争锁,原来的轻量锁膨胀为重量锁。这里有个问题:为啥偏向锁没有出来冒泡

    展开全文
  • **对象头(Header):**包含两部分,第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等,32 位虚拟机占 32 bit,64 位虚拟机占 64 bit,官方称为 ...

    在 HotSpot 虚拟机中,一个对象的存储结构分为3块区域:对象头(Header)、实例数据(Instance Data) 和 对齐填充(Padding);
    **对象头(Header):**包含两部分,第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等,32 位虚拟机占 32 bit,64 位虚拟机占 64 bit,官方称为 ‘Mark Word’;
    在这里插入图片描述

    第二部分是类型指针,即对象指向它的类的元数据指针,虚拟机通过这个指针确定这个对象是哪个类的实例,另外,如果是Java数组,对象头中还必须有一块用于记录数组长度的数据,因为普通对象可以通过 Java 对象元数据确定大小,而数组对象不可以;

    **实例数据(Instance Data):**程序代码中所定义的各种成员变量类型的字段内容(包含父类继承下来的和子类中定义的);

    **对齐填充(Padding):**不是必然需要,主要是占位,保证对象大小是某个字节的整数倍,HotSpot虚拟机,任何对象的大小都是8字节的整数倍;

    https://blog.csdn.net/weixin_39982236/article/details/110724755

    展开全文
  • class linking:连接,连接又有具体的三步,分别是:验证(验证包括:calss文件格式验证、meta元数据验证等)、准备、解析:对应会给变量赋默认值。 class initializing 静态初始化的过程,这里会给变量赋值初始值;...
  •  HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度...
  • java对象头详解

    千次阅读 2022-05-29 19:44:06
    HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 对象头:比如 hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID,...
  • Java对象的对象头到底是什么

    千次阅读 2020-08-17 14:54:58
    HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度在32...
  • 包括: identity hashcode GC 锁 比如刚刚的代码,将变量加上一个锁,输出: 可以查看出markword 的值会改变 根据下面的一张图,回答问题 我们能不能将GC年龄调高一点,变成32? 不能,因为分代年龄存储的字节...
  • 两种说法中对象头涵盖的内容不同,前者所指的Object Header仅仅指的是markOop指针的大小——在32位机器上指针的大小是32bit(4Bytes),在64位机器上指针的大小是64bit(8Bytes);而后者除了markOop指针之外,还包含了...
  • Java的对象头

    千次阅读 2021-03-09 22:06:25
    当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含对象头以及实例数据。这里提到的对象头到底是什么呢?```class oopDesc {friend class V...
  • Java对象头结构

    2021-12-08 18:26:20
    Java对象(Object 实例) 结构包含三部分:对象头、对象体、对其子节,具体如下图所示 对象的三个部分 对象头 对象头包括三个字段,第一个字段叫作Mark Word (标记字),用于存储自身运行时的数据,例如GC标志位...
  • java对象头信息

    万次阅读 多人点赞 2019-09-02 14:27:14
    2. 为什么在jdk1.6后,synchronized关键字性能有所提高,为什么会提高?并且很多文章中都说synchronized锁有偏向锁、轻量锁、重量锁等状态? 3. java对象是在那里设置了指针指向对应的方法区中的元数据的? 4. 在...
  • 1、创建了Customer()实例 和 Account()实例 2、对象头里包括:运行时元数据、类型指针、实例数据、对齐填充 ① 运行时元数据里又包括:哈希值(HashCode)、GC分代年龄、...③ 实例数据:真实记录一个对象包含的数据.
  • Java对象内存布局和对象头

    千次阅读 2022-06-26 15:29:03
    在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)2、对象在堆内存中的存储布局Mark Word:对象标记 Class Pointer:类元信息(又...
  • 中大体介绍了Java中 new 对象背后的主要流程,其中对象头的部分,我们仅仅是点到为止,这里我们深入剖一下Object Header的奥秘 。 总览 初始化默认值以后,JVM要对对象进行必要的设置,例如这个对象是哪个类的实例...
  • java对象头 MarkWord

    万次阅读 多人点赞 2019-06-05 20:41:15
    原文链接:[https://blog.csdn.net/scdn_cp/article/details/86491792#comments] 我们都知道,Java对象存储在堆(Heap)内存。那么一个Java对象到底包含什么呢?概括起来分为对象头、对象体和对齐字节...
  • 对象头的内部结构一张图了解所有细节 1、创建了Customer()实例 和 Account()实例 2、对象头里包括:运行时元数据、类型指针、实例数据、对齐填充 ① 运行时元数据里又包括:哈希值(HashCode)、GC分代年龄、锁状态...
  • Java-对象头详解

    千次阅读 2021-01-11 14:48:47
    这里只介绍64位虚拟机的对象头的结构和内容,主要是分为以下四种状态介绍,无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。 对象头的基本结构 如下图所示 对象的结构和内容我这里就暂且不提了,本章主要讲述的...
  • Java对象头与monitor

    千次阅读 2020-09-03 15:11:35
    由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能,这些标记字段组成了对象头。 一、对象头形式 JVM中对象头的方式有以下两种(以32...
  • JVM对象头的简单记录

    千次阅读 2019-12-24 01:34:10
    JVM对象头信息的简单记录 对象头信息 Mark Word 锁状态(无锁、偏向锁、轻量级锁CAS、重量级锁、GC标记) GC年代记录(分代年龄) hashcode (调用 System.identityHashCode(对象) 获得,HotSpot使用xor-shift算法)...
  • Java的对象头和对象组成详解

    万次阅读 多人点赞 2018-07-20 10:46:47
    一,对象头 1,Mark Word 2,指向类的指针 3,数组长度 二,实例数据 三,对齐填充字节 Java对象保存在内存中时,由以下三部分组成: 1,对象头 2,实例数据 3,对齐填充字节 一,对象头 java的对象头...
  • HotSpot虚拟机中,对象在内存中存储的布局可以... JVM的对象头包括二/三部分信息:1、Mark Word;2、 类型指针;3、数组长度(只有数组对象才有)  1、Mark Word 用于存储对象自身的运行时数据, 如哈希码(Ha...
  • 今天看别人的博客,讲到面试相关的问题,其中有一个知识点是:synchronized关键字,Java对象头、Markword概念、synchronized底层实现,monitorenter和monitorexit指令,一脸蒙逼,虽然早期把《深入理解Java虚拟机》...
  • 首先好看一个图,我大概会根据图中的内容来分享这六个步骤(其实几个步骤不重要,只要包括的内容都在就行): 可以看完这个图就懵了,以下是创建对象的六个步骤: 1、判断是否能在常量池中能找到类符号引用,并检查...
  • 对象头对象头包括两部分:Mark Word 和 类型指针。Mark WordMark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与...
  • 最近在寻找实习岗位,面试官问了http中请求头包含什么,回答的不是很清楚,这里做一个小结。 1. http请求,请求和响应都有什么信息? 页面和服务器交互最常见的方式就是ajax,ajax简单来说是浏览器发送请求到...
  • 对象头包含的信息 1.Mark Word: 这一部分主要包括 存储对象自身的运行时数据,如哈希码(HashCode)、 GC分代年龄、 锁状态标志、 线程持有的锁、 偏向线程ID、 偏向时间戳等。 注意这里的1bit,主要是表名...
  • a)对象头包含运行时元数据和类型指针。运行时元数据包含哈希值(这个哈希值就是创建出来的对象在内存中的地址)、GC分代年龄、锁状态标志等。类型指针,指向方法区(元空间)中对象所属的类型。如果创建的是数组,对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 634,944
精华内容 253,977
关键字:

对象头包括什么