JVM精进之路

JVM相关问题一网打尽
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

说说Java对象的创建过程

发布于 2024-08-29 | 更新于 2024-08-29

1. 类加载检查

在JVM中,当执行到new指令时,首先会检查这条指令的参数是否可以在常量池中找到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载、链接(验证、准备和解析)、初始化。如果没有,JVM会先执行相应的类加载过程。

2. 内存分配

关于对象大小

  • 类加载完成后确定大小:在Java中,一个对象所需的内存大小是在类加载完成之后便可完全确定的。类加载的“准备”阶段主要涉及为类变量分配内存并设置初始值,这通常发生在方法区中。此时,JVM已经确定了类的结构,包括字段和方法数据,以及对象头(存储对象自身运行时数据,如哈希码、GC分代年龄等)的大小。
  • 实例字段的布局:对于类的每个实例,JVM都会根据类的定义分配固定的内存量,这包括所有实例字段的空间(不论字段数据类型)和一些内部的管理数据,比如对象头。即便对象里面有字符串类型,那么对象存储的是字符串对象的地址引用,大小也是固定的,不会随着字符串的改变而改变。

一旦类检查通过,接下来JVM为新对象分配内存。对象内存通常在堆上分配。

分配内存的方法

内存分配的方式可能为“指针碰撞”(Bump the Pointer)或者是空闲列表法。

并发场景下如何分配内存?

参考后续的问题解答。

3. 初始化零值

分配完成后,JVM会将分配的内存空间除对象头外的所有属性值初始化为零值,确保对象有一个干净的状态。程序能访问到这些字段的数据类型所对应的零值。

4. 设置对象头

JVM接着会在对象头中设置必要的信息,如这个对象属于哪个类的实例、如何访问类的元数据信息、对象的哈希码(如果有的话)、对象的GC分代年龄等。

5. 执行<init>方法

在所有这些设置完成之后,JVM将执行对象的构造函数或者称为<init>方法,与上面初始化零值不同,这里会使用代码里面设置的值对对象赋值,这样对象就被完全构造出来了。

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/jvm/memory-management/object-creation-process.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。