【JVM系列】一步步解析java執行內幕

        對於任何一門語言,要想達到精通的水平,研究它的執行原理(或者叫底層機制)不失爲一種良好的方式。在本篇文章中,將重點研究java源代碼的執行原理,即從程java

序員編寫JAVA源代碼,到最終造成產品,在整個過程當中,都經歷了什麼?每一步又是怎麼執行的?執行原理又是什麼?.....編程

       固然,本篇文章的粒度可能稍微側重於宏觀方面,更細粒度的技術分析,須要在接下來的該系列文章中與你們分享....bootstrap

一 編寫java源程序工具


  java源文件:指存儲java源碼的文件;開發工具

當前比較主流的JAVA IDE?優化

(1)Intellij IDEA(首推薦)編碼

(2)Eclipsespa

先來看看以下代碼:操作系統

//MyTest被public修飾,故存儲該java源碼的文件名爲MyTest
public class MyTest {
    public static void main(String[] args){
        System.out.println("Test Java execute process.");
    }
}

//因爲MyTest被public修飾了,故Class A不能用public修飾
class A{}
//因爲MyTest被public修飾了,故Class B不能用public修飾
class B{}

(1)java源文件名就是該源文件中public類的名稱線程

(2)一個java源文件能夠包含多個類,但只容許一個類爲public

二 編譯java源代碼


      當java源程序編碼結束後,就須要編譯器編譯,安裝好jdk後,咱們打開jdk目錄,有兩個.exe文件,

即javac.exe(編譯源代碼,即.java文件)和java.exe(執行字節碼,即.class文件)

1.切換到MyTest.java文件夾

2.javac.exe編譯MyTest.java

編譯後,發現e:\Blogs 目錄多了以class爲後綴的文件:A.class,B.class和MyTest.class

Tip:當javac.exe編譯java源代碼時,java源代碼有幾個類,就會編譯成一個對應的字節碼文件(.class文件),

其中,字節碼文件的文件名就是每一個類的類名。須要注意的是,類即便不在源文件中定義,但被源文件引用,

編譯後,也會編程相應的字節碼文件,如類A引用類C,但類C不定義在類A的源文件中,編譯後,類C也被編

譯成對應的字節碼文件C.class

三 執行java源文件


 執行java源文件,用java.exe執行便可

到如今,java源程序基本執行結果,並正確打印咱們指望的結果,那麼,如上的步驟,咱們能夠總結以下:

如上總結,已經抽象化了在JVM中的執行,接下來,咱們將分析,字節碼文件(.calss文件)如何在虛擬機中一步一執行的。

四 JVM如何執行字節碼文件


 (一) 裝載字節碼文件

        當.java源碼被javac.exe編譯器編譯成.class字節碼文件後,接下來的工做就交給JVM處理,JVM首先經過類加載器(ClassLoader)

將class文件和相關Java API加載裝入JVM,以供JVM後續處理。

       在該階段中,涉及到以下一些基本概念和知識。

 1.JDK,JRE和JVM關係

(1)JDK(Java Development Kit),Java開發工具包,主要用於開發,在JDK7前,JDK包括JRE

(2)JRE(Java Runtime Environment),Java程序運行的核心環境,包括JVM和一些核心庫

(3)JVM(Java Virtual Machine),VM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬

         各類計算機功能來實現的,是JRE核心模塊。

2.JVM

       JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。Java虛擬機

虛擬機的主要任務是裝載class文件並執行其中的字節碼,不一樣的Java虛擬機中,執行引擎可能由不一樣的實現,大體有以下幾種引擎:

  •    一次性解釋字節碼引擎
  •     即時編譯引擎
  •    自適應優化器

     關於虛擬機的實現方式,採用軟件方式、硬件方式和軟件硬件結合方式,這個要根據具體廠商而定。

3.什麼是ClassLoader

       虛擬機的主要任務是裝載class文件並執行其中的字節碼,而class文件是由虛擬機的類加載器(ClassLoader)完成的,在一個Java虛擬機,

有可能存在多個類加載器。

       任何java運用程序,可能會使用兩種類加載器,即啓動類加載器(bootstrap)和用戶自定義類加載器。

       啓動類加載器是Java虛擬機惟一實現的一部分,它又可分爲原始類裝載器,系統類裝載器或默認類裝載器,它的主要做用是從操做系統的

磁盤裝載相應的類,如Java API類等。

       用戶自定義裝載類,按照用戶自定義的方式來裝載類。

(二)將字節碼文件存儲在JVM內存區

       當JAVA虛擬機運行一個程序時,它須要內存來存儲許多東西,如字節碼,從已裝載的class文件中獲得的其餘信息,程序建立的對象,傳遞給

方法的參數,返回值,局部變量以及運算的中間結果等,這些相關信息被組織到「運行時數據區」。

       根據廠商的不一樣,在Java虛擬機中,運行時數據區也有所不一樣,有些運行時數據區由線程共享,有些只能由某個特定線程共享。運行時數據區

大體可分幾個區:方法區,堆區,棧區,PC寄存器區和本地方法棧區。

       在該階段中,涉及到以下基本概念和知識。

      1.方法區

        方法區用來存儲解析被加載的class文件的相關信息。當虛擬裝載一個class文件後,它會從這個class文件包含的二進制數據中解析類型信息,而後將

該相關信息存儲到方法區中。

      2.堆

         堆是用來存儲相關引用類型的,如new對象。當程序運行時,虛擬機會把全部該程序在運行時建立的對象都放到堆中。

     3.PC寄存器

        PC寄存器主要用來存儲線程。當新建立一個線程時,該線程都將獲得一個本身的PC寄存器(程序計數器)以及一個java棧。

Java虛擬機沒有寄存器,其指令集使用Java棧來存儲中間數據。

     4.棧區

       棧區主要用來存儲值類型的,如基本數據類型,須要注意的時,String爲引用類型,是存在堆中的。Java棧是由許多棧

幀組成的,一個棧幀包含一個Java方法調用的狀態,當線程調用一個方法時,虛擬機壓入一個新的棧幀到該線程的Java棧中

,當該方法返回時,這個棧幀從Java棧中彈出。

(三)執行引擎與運行時數據區交互

   運行時數據區爲執行引擎提供了執行環境和相關數據,執行引擎經過與運行時數據區交互,從而獲取

執行時須要的相關信息,存儲執行的中間結果等

 

(四)執行引擎與本地方法接口

當要執行本地方法時,執行引擎將調用本地方法接口來獲取相關OS本地方法,須要注意的是,本地方法與操做系統強耦合的。

(五)JVM在具體操做系統上執行

JVM經過調用本地接口來獲取本地方法,從而實如今具體的平臺上執行,如在Linux系統上執行,在Window系統上

執行和在Unix系統上執行。

五  參考文獻


 【01】深刻Java虛擬機(原書第2版)(美)Bill Venners 著  

【02】Core Java Volume I - Fundamententals(10th Edition) (美) Cay S.Horstmann

【03】Core Java Volume I - Advanced Features(10th Edition) (美) Cay S.Horstmann

六  版權區


  •    轉載博客,必須註明博客出處
  •    博主網址:http://www.cnblogs.com/wangjiming/
  •    如您有新想法,歡迎提出,郵箱:2098469527@qq.com
  •   專業.NET之家技術QQ羣:490539956
  •   專業化Java之家QQ羣:924412846
  •   有問必答QQ羣:2098469527
  •   一對一技術輔導QQ:2098469527
相關文章
相關標籤/搜索