Java中String类型的大小

java对象在HotSpot虚拟机中的结构

在这里插入图片描述

Java对象由三部分组成,对象头、实例数据、填充数据。

对象头
  1. markwork

    存储对象运行时数据,HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID、偏向时间戳等。在64位虚拟机中,如果没有开启压缩指针,占用64bit。

    无锁
    锁状态25位31位1位4位1位(偏向锁位)2位(锁标志)
    无锁unusedhashCode(调用hashCode方法时填充)unused分代年龄001
    偏向锁
    锁状态54位2位1位4位1位(偏向锁位)2位(锁标志)
    偏向锁当前线程指针Epochunused分代年龄101
    轻量级锁(自旋锁)
    锁状态62位2位(锁标志)
    轻量级锁指向线程栈中LockRecord的指针(通过自旋竞争锁CAS,有次数上限)00
    重量级锁
    锁状态62位2位(锁标志)
    重量级锁指向互斥量(重量级锁)的指针10
  2. klass

    Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class对象(其对应的元数据对象)的内存地址。

  3. 数组长度

    只有数组对象有数组长度,如果对象为数组,对象头中必须记录数组长度。

对象实际数据

包括了对象的所有成员变量,其大小由各个成员变量的大小决定

填充

填充数据不是必须存在的,没有特别的含义,只是占位,HotSpot中VM内存管理系统要求对象起始地址必须是8字节的整数倍,
即对象大小必须是8字节的整数倍,对象头是8字节的1或2倍。

Java中String类型的大小

String成员变量

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;

对象头(未开启压缩指针):8 (Markdown)+ 4(Klass指针)+(8+4+4)(char数组大小) + 4(hash大小)+ 8(serialVersionUID大小) = 40

非空String内存大小

40(空对象大小) + 2(一个char2字节) * n

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值