java 普通对象,内存分配, 。数组类型 会多个数组长度表示,占用的长度是系统位宽
组成部分:头+实例数据+填充(保证整体字节数量是8的倍数)
对象头:包含两部分: markword+ 类型指针(确定对象是哪个类的实例,不一定都有,看虚拟机实现)
1,对象头
1.1markword: 32位系统 4个字节; 64位系统:8字节。
此部分,数据结构不固定,根据加锁情况,存储内容会变化。
32位系统:25bit+4bit(分代年龄)+2bit(锁标识)+1bit(固定0)
分代年龄:垃圾回收,进入老年代判断使用。4bit决定 取值范围0-15。年轻代每回收一次+1
不是都到15了才进入。大对象,动态分代年龄(当Survivor区 相同年龄 的所有对象 合计大于Survivor空间的一半,年龄大于或等于该平均年龄值的对象,可直接进入老年代 )
说明: Survivor 。一级分类:年轻代+old。年轻代:eden+Survivor,Survivor:from+to(复制算法 设计如此,垃圾回收时用来交换)。
比列一般情况:eden(1/3*0.8)+from(1/3*0.1)+to(1/3*0.1)+old(2/3)
锁标识:无锁,偏向锁,轻量级,重量级
1.2类型指针kclass
32位系统:4个字节。64位系统:不开启指针压缩8字节,开启后时4个字节。
2,实例数据:
基本类型: boolean, byte 1. short. char 2 int float 4 double,long 8
引用类型: 32位系统:4个字节。64位,不开启指针压缩是8字节,开启后时4个字节。
总结,实例数据部分, 基本类型,32位和64位系统 内存分配长度一样。1,2,4,8
引用类型,32位系统,32位。64位,不开启压缩是64位,开启是32位
3,填充部分:0-7 字节
说明,指针压缩参数:jdk1.6 update14开始,64系统 jvm支持指针压缩。启用指针压缩-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops
oop(ordinary object pointer) 对象指针的意思。
面试题:
Object obj =new Object(); 内存占用。
单说 对象内存分配,不考虑引用obj,根据前面讲解分析,32位系统 8个字节。64位系统16个字节。
参考: