JVM oop内存模型

一、oop模型

1.1 oop分类

1、非数组对象 InstaceOopDesc

2、数组对象  arrayOopDesc

        2.1 基本数据类型数组 typeArrayOopDesc

        2.2 引用类型数组 objArrayOopDesc

 3、MarkOopDesc

        存放锁信息、分代年龄等

1.2 oop和Klass关系

1、InstanceKlass是JVM中表示类的对象的数据结构。JVM在加载class时,会创建instanceKlass,表示其元数据,包括常量池,字段,方法等,存放在方法区,instanceKlass是JVM中的数据结构
2、 InstanceOopDesc是JVM中表示实例对象的数据结构。在new一个对象时,JVM创建instanceOopDesc表示这个对象,存放在堆中,其引用存放在栈中instanceOopDesc对应Java中的对象实例
3、new操作返回的instanceOopDesc类型指针指向instanceKlass,而instanceKlass指向对应类型的Class实例的instanceOopDesc
4、在JDK6中,Class对象存放在方法区,JDK7和JDK8中,Class对象存放在Java堆中。

二、对象的内存结构

 对象内存结构分成三大部分

对象头 (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++代码结构

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值