上一章节带着大家初探JVM的类加载机制,以及双亲委派机制,本文主要介绍了Java对象头的组成以及详解
对象在内存中的布局包含:对象头
(Mark Word、Klass Pointer)、实例数据
、对象填充
基本类型 | 字节 | 位数 |
---|---|---|
byte | 1 byte | 8 bit |
char | 2 byte | 16 bit |
int | 4 byte | 32 bit |
short | 2 byte | 16 bit |
long | 8 byte | 64 bit |
double | 8 byte | 64 bit |
float | 4 byte | 32 bit |
public class Demo1 {
public static void main(String[] args) {
LockObject lockObject = new LockObject();
System.out.println(ClassLayout.parseInstance(lockObject).toPrintable());
}
static class LockObject{
int a = 4;
long b = 1;
boolean c = false;
}
}
根据上面基本类型占用的字节和位数可计算出:
在开启了指针压缩的情况下:
offset:相对于类对象所占内存区域起始位置的偏移
偏向锁标识位 | 锁标志位 | 锁状态 | 存储内容 |
---|---|---|---|
0 | 01 | 未锁定 | hash code(31),年龄(4) |
1 | 01 | 偏向锁 | 线程ID(54),时间戳(2),年龄(4) |
无 | 00 | 轻量级锁 | 栈中锁记录的指针(64) |
无 | 10 | 重量级锁 | monitor的指针(64) |
无 | 11 | GC标记 | 空,不需要记录信息 |
本文主要介绍了Java对象头的组成以及详解
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。