对象创建过程
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());)
网友评论