hello world 執行原理

1 public class HelloWorld { 2     public static void main(String[] args) 3  { 4  String s ; 5               s = 「Hello World!」;  //定義字符串s
6  System.out.println(s); 7  } 8 }
↑↑↑是一個簡單的java程序 HelloWorld 
Java代碼編譯是由Java源碼編譯器來完成,流程圖以下所示:

Java字節碼的執行是由JVM執行引擎來完成,流程圖以下所示:

程序執行分析以下: 

①  使用 javac  對 HelloWorld.java 源文件進行編譯爲 HelloWorld.class 字節碼文件。( jdk 開發工具箱中包含 javac 編譯工具和 jre 運行時環境)java

 ②  類的加載階段,加載至JVM內存中,Main方法就是程序的入口,而後由JVM虛擬機來解釋執行,在一些虛擬機的實現中,還會被JVM利用字節碼解釋器特定系統的機器碼執行,從而提升執行效率。數組

  java語言裏負責解釋執行字節碼文件的是java虛擬機,既 JVM(java Virtual Machine)。(JVM是可運行java字節碼文件的虛擬計算機)工具

 ③  虛擬機經過類找到HelloWorld的主方法(程序的入口方法),訪問權限爲public(公有可用),虛擬機傳遞String[](字符串數組對象:空數組)類型參數的地址到主方法的args中去,並在棧區爲args開闢內存空間,返回一個void的返回值;開發工具

  JVM 將內存區域劃分爲 Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程序計數器) ,   VM Stack(虛擬機棧,也有翻譯成JAVA 方法棧的),Native Method Stack  ( 本地方法棧 ),其中Method Area 和  Heap 是線程共享的  ,VM Stack,Native Method Stack  和Program Counter Register  是非線程共享的。spa

 JVM 內存中線程是否共享示意圖:

④  定義一個String(標準類庫中的)類型的變量(在棧區開闢空間)s,s的值不肯定(垃圾值,編譯沒法經過);線程

 ⑤  s = 「Hello World!」,對象「Hello World!」在方法區的常量數據區開闢空間,屬性即爲:Hello World!,方法即爲:toString(),變量s存放對象「Hello World!」的地址;翻譯

 ⑥  虛擬機找到標準類庫中的System.class類並加載到內存中(即方法區的類代碼區中),System.out爲標準字節輸出流對象(),並調用println()方法將變量s的值打印到屏幕上。code

 

PS: 虛擬機調用主方法時會建立三個默認對象:System.out(標準字節輸出流對象)、System.in(標準字節輸入流對象)和System.error(標準字節出錯流對象).對象

以上共涉及:blog

1個java文件:HelloWorld.java

4個class類: HelloWorld.class、String[].class、String.class、System.class

5個對象: 「Hello World!」、String[]、System.out、System.in、System.error

2個變量:args、s

3個方法:main()、toString()、println()

相關文章
相關標籤/搜索