通过 HelloWorld 了解 Java 程序执行过程以及运行时内存

1,780 阅读1分钟
public class HelloWorld {
	public static void main(String[] args) {
		String s;
		s = "HelloWorld";
		System.out.println(s);
	}
}

运行过程

那么 Java 是如何执行这段代码的呢?

1.调用 Java 的编译命令

javac HelloWorld.java

  • Java 编译器首先找到源文件中的 public class ,再找根据 public class 找到源文件中的其他类,Java 编译器会根据每一个类生成一个字节码文件( JVM 可以读懂的文件类型)

2.通过 Java 命令执行刚才生成的 .class 文件

java HelloWorld

  • 系统找到文件中唯一的主类 public class
  • public static关键字找到跟主类关联可执行的 main 方法。
  • String [] args:系统会传递一个空的字符串数组给主方法。系统加载 String [].class 字节码文件到方法区,系统会为 args 变量在主线程的栈帧中开辟一块空间(存放 String [] 数据的地址)指向堆中存放的数据。
  • String s:系统加载 String.class 字节码文件到方法区,在主线程栈帧中为 s 变量开辟一块空间(存放数据的地址),此时 s 的值还没有确定(垃圾值,编译无法通过)。
  • s="HelloWorld" :字符串 "HelloWorld" 被存放到方法区的常量区中,并让 s 指向该地址。
  • System.out.println(s) :系统加载 System.class 字节码文件到方法区,并且系统会默认在堆区创建 System.outSystem.inSystem.err 三个对象。
  • 字符串在被输出时会自动调用 toString() 方法。

内存图:

内存图

3.得到输出结果

HelloWorld

相关概念

  • 1 个源文件:HelloWorld.java
  • 4 个字节码文件:HelloWorld.class、String[].class、String.class、System.class
  • 5 个对象:"HelloWorld"、String[]、System.out、System.in、System.err
  • 2 个变量:args、s
  • 3 个方法:main()、System.out.println()、toStting()