一、oop模型
1、非数组对象 InstaceOopDesc
2、数组对象 arrayOopDesc
2.1 基本数据类型数组 typeArrayOopDesc
2.2 引用类型数组 objArrayOopDesc
3、MarkOopDesc
存放锁信息、分代年龄等
二、对象的内存结构
对象内存结构分成三大部分
对象头 (64位操作系统)
mark world 占8B
kclass pointer类型指针
开启指针压缩(默认)4B
关闭指针压缩 8B
数组长度 4B
对象不是数组,占0B
对象是数组,占4B
实例数据 instance Data
4类8种
boolean 1B
char 2B 0-65535
byte 1B -128~127(-2的7次方到2的7次方-1)
short 2B -32768~32767(-2的15次方到2的15次方-1)
int 4B -2147483648~2147483647(-2的31次方到2的31次方-1)
long 8B -9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
float 4B 3.402823e+38~1.401298e-45
double 8B 1.797693e+308~4.9000000e-324
引用类型
开启指针压缩4B
关闭指针压缩8B
对齐填充区域
填充位数保证是8的整数倍
三、如何计算对象大小
public class A {
// 普通对象
int a = 1;
int b = 2;
public static void main(String[] args) {
A a = new A();
}
}
没实例数据的对象
开启指针压缩
16B = 8B + 4B + 0B + 0B + 4B
关闭指针压缩
16B =8B +8B +0+0+0
普通对象 (数组对象,在关闭指针压缩的情况下会出现两端填充)
开启指针压缩
24 =8B + 4B + 0B + 4*2 +4B
关闭指针压缩
24 =8+8+0+4*2+ 0
四、指针压缩的实现原理
为什么要开启指针压缩为
了节省内存
寻址效率就有所提高
指针压缩的实现原理
两句话
两个信息 :
1、java中所有的对象都是8字节对齐的
2、最后三位是0,存储的时候后三位0抹除,使用时,后三位补0
指针压缩C++代码结构