深入解析JVM-Java对象头组成

并发专题

深入解析JVM-类加载机制

深入解析JVM-Java对象头组成

深入JVM内置锁 synchronized 底层

深入理解JMM-Java内存模型

深入理解JMM-volatile原理分析

并发编程-深入解析CAS

并发编程-深入AQS原理

目录

一个对象如何组成的?

基本类型占用的字节和位数

new 一个对象占用多少字节

 对象内存中offset作用

对象头详解


一个对象如何组成的?

对象在内存中的布局包含:对象头(Mark Word、Klass Pointer)、实例数据、对象填充

Mark Word:用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。

Klass Pointer:对象指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

实例属性:定义类中的成员属性。

对齐填充:由于HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,也就是对象的大小必须是8字节的整数倍。

基本类型占用的字节和位数

基本类型字节位数
byte1 byte8 bit
char2 byte16 bit
int4 byte32 bit
short2 byte16 bit
long8 byte64 bit
double8 byte64 bit
float4 byte32 bit

new 一个对象占用多少字节

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;
    }
}

在开启了指针压缩的情况下:

对象头 12个字节

实例数据 int  a=4 4个字节 long b=1 8个字节 boolean c=false 1个字节

对齐补充 7个字节。

总共32个字节

 对象内存中offset作用

对象头详解

1、 哈希值:31位的对象标识hashCode,采用延迟加载技术。它是一个地址,用于栈对堆空间中对象的引用指向。

2、GC分代年龄(占4位):记录幸存者区对象被GC之后的年龄age,一般age为15(阈值为15的原因是因为age只有4位最大就可以将阈值设置15)

3、锁状态标志(占2位):记录一些加锁的信息

偏向锁标识位

锁标识位

锁状态

存储内容

0

01 

未锁定

hash code(31),年龄(4)

1

01

偏向锁

线程ID(54),时间戳(2),年龄(4)

00

轻量级锁

栈中锁记录的指针(64)

10

重量级锁

monitor的指针(64)

11

GC标记

空,不需要记录信息

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

janyxe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值