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

2021-03-30  本文已影响0人  填坑之路_DK

对象创建过程

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());)

上一篇 下一篇

猜你喜欢

热点阅读