1 public class PersonTest {
 2     public static void main(String[] args){
 3         Person person = new Person("大火",18);
 4         person.show();
 5     }
 6 }
 7 
 8 class Person{
 9     public String name;
10     public int age;
11     
12     public Person(){};
13     public Person(String name, int age) {
14         System.out.println("我的名字是"+name);
15         System.out.printf("我今年%d岁了%n",age);
16     }
17     
18     public static void show() {
19         System.out.println("我是一名歌手");
20     }
21 }

在jvm虚拟机运行Java程序的过程中,会将内存划分为若干个不同的区域,大概分为

  • PC寄存器(Program counter register)
  • Java虚拟机栈(Java virtual machine stack)
  • 堆(Heap)
  • 方法区(Method area)
  • 本地方法栈(Native method stack)

在以上程序运行的过程中

按我的理解,jvm先将两个class文件加载到内存中,首先将两个class文件分配到方法区中,然后进入程序入口main运行Java程序

  首先声明一个Person类型的变量person,然后new出一个对象实例person将其地址值分配给变量person

  声明的Person类型变量person在Java虚拟机栈内,new出的对象实例person在堆空间内

  在new person的时候,jvm首先在方法区内查找有没有person类,此时发现有,然后将person类中的成员变量与方法的地址值拿来放到自己内存中,然后将自身的地址值传递给之前声明的变量person

  此时,Person person = new Person();的过程结束

  然后发现new Person()中含有两个参数  "大火"  和 18 ,然后jvm开始去方法区查找有没有符合参数类型的构造方法,发现有,开始传递参数,将 "大火" 传递给 String name;将 18 传递给 int age;

  此时的传递是传递到堆空间中 new 出来的 Person(); 传递完毕执行构造方法中的打印语句打印出事先编辑好的内容;此时返回栈空间继续执行main方法,

  遇到 person.show();  开始执行该语句,首先去堆空间查看 变量person 的地址,然后去堆空间找到person所指向的实例 new Person(),然后找到事先存储好的 show() 的地址,去方法区内找到 show() 方法

  然后打印出事先编辑好的内容,随后main方法结束,堆空间内Person实例没有被指向的引用,CG开始回收,程序结束。

2021-09-30