一、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++代码结构文章来源:https://www.toymoban.com/news/detail-519594.html
文章来源地址https://www.toymoban.com/news/detail-519594.html
到了这里,关于JVM oop内存模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!