-
对象的创建
(1) 仅讨论new一个普通的Java对象的过程
1° JVM会检查方法区的运行时常量池中是否有这个类的符号引用,以及这个类是否已经被加载、解析和初始化过。如果没有,则进行类的加载过程(chapter07)
2° 在Java堆中为新生的对象分配内存(在类加载的过程中,对象所需的内存即可确定)
3° 将分配到的内存空间都初始化为零值(类加载的结果是:类的静态变量在准备过程赋零值,然后初始化过程赋真正的值;这一步的结果是,类的非静态变量先初始化为零值)
4° 设置__对象头__的信息:例如对象属于哪个类、GC分代年龄、对象的hashCode等
5° 调用方法(实例构造器),将类的非静态变量赋真正的值
-
对象的内存布局
(1) Java堆中的每个对象在内存中,分为3个部分:对象头 + 实例数据 + 对齐填充
(2) 对象头:保存对象自身的运行时信息
(3) 实例数据:保存对象的实例字段(包括父类继承的和子类中定义的)
(4) 对齐填充:Hotspot中,对象在内存中的大小必须是8字节的整数倍,对象头一定是8字节的整数倍,实例数据不一定,所以这部分用于对齐
-
对象的访问定位
(1) 栈上(虚拟机栈、本地方法栈)保存了指向对象的引用,访问方式一般有两种: 句柄访问/直接指针访问
(2) 句柄访问:Java堆上分配一块内存作为__句柄池__,句柄池中保存对象的句柄地址,栈上保存对象的句柄地址
优势:GC发生时,对象会被移动,只需更新句柄中的地址,不需要更新栈上的数据
(3) 直接指针访问:栈上直接存储对象的地址
优势:节省了一次指针定位的时间开销,速度更快
chapter02_Java内存区域与内存溢出异常_2_HotSpot虚拟机中的对象
最新推荐文章于 2024-08-05 00:06:56 发布
本文详细解析Java对象从创建到内存布局的全过程,包括JVM如何检查类的加载状态,对象内存分配、初始化,对象头信息设置及实例构造器调用。同时,介绍了对象在Java堆中的布局结构,以及访问定位的两种方式:句柄访问和直接指针访问。
1434

被折叠的 条评论
为什么被折叠?



