作者:灸灵侯嗒黍_147 | 来源:互联网 | 2024-12-12 20:30
本文通过一个简单的Java类`Person`的示例,详细解析了JVM在加载和运行时如何处理类和对象的内存分配过程。通过具体代码演示,帮助读者更好地理解和掌握JVM内存管理的核心概念。
为了更好地理解JVM内存加载的过程,我们可以通过分析一个简单的Java类来深入了解。以下是一个名为`Person`的Java类的定义:
Person.java
public class Person {
private String name;
private int age;
static int count = 0;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHi() {
System.out.println("姓名:" + this.name + ",年龄:" + this.age);
}
}
接下来,我们来看一个测试该类的程序`TestPerson.java`:
public class TestPerson {
public static void main(String[] args) {
Person person = new Person("kallen", 20);
person.sayHi();
}
}
JVM对象初始化步骤详解:
- 当JVM加载`TestPerson`类时,它会进行准备、链接和初始化三个阶段,这些阶段包括计算所需的堆空间大小等,最终将类型信息存储在方法区中。
- 在方法区中保存的字节码引导下,JVM开始执行`main`方法。`main`方法被推入执行栈中,如图所示:

- `main`方法的第一行代码`new Person("kallen", 20)`触发了对象创建过程。JVM首先检查方法区中是否存在`Person`类的信息,如果不存在,则加载该类并将其类型信息存储在方法区。根据`Person`类的类型信息,JVM在堆中分配相应的内存空间,并初始化成员变量(例如,`int`类型的成员变量初始化为0,引用类型初始化为`null`)。这是`new`关键字的第一步操作。
- 接着,JVM执行`new`操作的第二步,即调用`Person`类的构造方法来完成对象的具体初始化。完成后,将堆中对象的地址赋给引用变量`person`。至此,`Person person = new Person("kallen", 20)`这条语句的执行完成。

- 最后,调用`person`对象的`sayHi()`方法。通过`person`引用,JVM定位到堆中的`Person`对象,再通过该对象的方法区引用找到`sayHi`方法。`sayHi`方法随后被推入执行栈中,开始执行其中的字节码指令。
