通過 HelloWorld 瞭解 Java 程式執行過程以及執行時記憶體

wangchao96發表於2018-08-28
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()

相關文章