美文网首页
java 对象基础信息(创建过程,内存结构,如何定位,分配)

java 对象基础信息(创建过程,内存结构,如何定位,分配)

作者: 填坑之路_DK | 来源:发表于2021-03-30 11:13 被阅读0次

    对象创建过程

    class T{
      int m= 8;
    }
    T t = new T();
    

    对应汇编指令

    0 new #2<T>   // 分配内存
    3 dup
    4 invokespecial #3 <T.<init>>  //初始化(执行init方法)
    7 astore_1    //建立关联( 将引用指向到该内存)
    8 return
    

    内存结构

    Object o = new Object();
    在内存中的组成为:

                类型      起始位置 长度 
    头           markword   0       4  bytes (四个字节)  存锁信息
    头           markword   4       4  bytes (四个字节)  存锁信息
    头           classpoint 8       4  bytes (四个字节) (类定义指针 开启压缩后为 4个字节 不开启为8,默认开启 64位jvm)
    (数组特有)    length    12       4  bytes (四个字节)  数组特有结构
                  实例数据   -       -        (空对象没有实例数据,否则默认往后追加, 注意 普通引用 例如String  也是默认压缩 为4字节,不压缩为8 64位jvm)
                  补位数据   12      4  bytes (四个字节,由于cpu读取和总线宽度有关,为了读取速度更快,jvm会将对象占用内存大小,优化为 8的 倍数)
    

    markword存储信息包括

    • synchronized锁信息
    • GC信息(分代年龄)
    • HashCode(对象独一无二的HashCode,不是重写的方法值)

    对象怎么定位

    • 句柄方式 : 间接寻址,(GC稳定)
    • 直接指针 : 直接寻址

    对象分配过程

    • 局部小对象可以存储在栈中(C struct 结构体)
    • 大对象 默认是50M 可以通过参数配置 -XX:PretenureSizeThreshold
    • TLAB 线程本地缓存区(避免线程间内存竞争,不需要锁),也在伊甸园区
    • AGE 超过年龄限制
    分配过程

    工具

    open jdk 提供 JOL = Java Object LayOut java 对象 布局
    (打印对象内存模型 System.out.println(ClassLayout.parseInstance(o).toPrintable());)

    相关文章

      网友评论

          本文标题:java 对象基础信息(创建过程,内存结构,如何定位,分配)

          本文链接:https://www.haomeiwen.com/subject/vaubhltx.html