1. 程式人生 > >JAVA一些基礎概念

JAVA一些基礎概念

JRE為Java Runtime Environment的簡稱,Java Runtime Environment(包括Java Plug-in)是Sun的產品,包括兩部分:Java Runtime Environment和Java Plug-in。JavaRuntimeEnvironment(JRE)是可以在其上執行、測試和傳輸應用程式的Java平臺。它包括Java虛擬機器(jvm)、Java核心類庫和支援檔案。它不包含開發工具(JDK)--編譯器、偵錯程式和其它工具。JRE需要輔助軟體--Java Plug-in--以便在瀏覽器中執行applet。 Java Plug-in軟體允許Java Applet和JavaBean元件在使用Sun的Java Runtime Environment(JRE)的瀏覽器中執行,而不是在使用預設的Java執行環境的瀏覽器中執行。Java Plug-in可用於Netscape Navigator和Microsoft Internet Explorer。
J2RE
是Java2 Runtime Environment,即Java執行環境,只是強調其匹配Java2平臺,有時簡稱JRE。如果你只需要執行Java程式或Applet,下載並安裝它即可。如果你要自行開發 Java軟體,請下載JDK(JRE和JDK的區別)。JDK中附帶有JRE。注意由於Microsoft對Java的支援不完全,請不要使用IE自帶的虛擬機器來執行 Applet,務必安裝一個JRE或JDK。 接著在PATH路徑中找JRE 登錄檔HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 檢視CurrentVersion的鍵值指向哪個JRE 最常用的是在PATH路徑中找JRE,一般情況下,自己的程式執行之前都會先在
批處理檔案
裡面臨時設定PATH,把自己用的JRE放到PATH路徑最前面,所以肯定會執行自己帶的JRE,不會造成版本混亂。

JVM

 
JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。 Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機器是實現這一特點的關鍵。一般的高階語言如果要在不同的平臺上執行,至少需要編譯成不同的目的碼。而引入Java語言虛擬機器後,Java語言在不同平臺上執行時不需要重新編譯。Java語言使用Java虛擬機器遮蔽了與具體平臺相關的資訊,使得Java語言
編譯程式
只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。Java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。這就是Java的能夠“一次編譯,到處執行”的原因。

規格

編輯 JVM的設計目標是提供一個基於抽象規格描述的計算機模型,為解釋程式開發人員提供很好的靈活性,同時也確保Java程式碼可在符合該規範的任何系統上執行。JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行程式碼,即位元組碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼運算元的語法和數值、識別符號的數值表示方式、以及Java類檔案中的Java物件、常量緩衝池在JVM的儲存映象。這些定義為JVM直譯器開發人員提供了所需的資訊和開發環境。Java的設計者希望給開發人員以隨心所欲使用Java的自由。 JVM定義了控制Java程式碼解釋執行和具體實現的五種規格,它們是:

原理

編輯 JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基於下層的作業系統和硬體平臺並利用軟體方法來實現的抽象的計算機,可以在上面執行java的位元組碼程式。
java編譯器只需面向JVM,生成JVM能理解的程式碼或位元組碼檔案。Java原始檔經編譯器,編譯成位元組碼程式,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺執行。 JVM執行程式的過程 : I.載入.class檔案 II.管理並分配記憶體 III.執行垃圾收集 JRE(java執行時環境)包含JVM的java程式的執行環境 [1] JVM是Java程式執行的容器,但是他同時也是作業系統的一個程序,因此他也有他自己的執行的生命週期,也有自己的程式碼和資料空間。 JVM在整個jdk中處於最底層,負責與作業系統的互動,用來遮蔽作業系統環境,提供一個完整的Java執行環境,因此也就虛擬計算機.作業系統裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環境。 1.建立JVM裝載環境和配置 2.裝載JVM.dll 3.初始化JVM.dll並掛接到JNIENV(JNI呼叫介面)例項 4.呼叫JNIEnv例項裝載並處理class類[

棧結構

編輯 作為基於棧結構的計算機,Java棧是JVM儲存資訊的主要方法。當JVM得到一個Java位元組碼應用程式後,便為該程式碼中一個類的每一個方法建立一個棧框架,以儲存該方法的狀態資訊。每個棧框架包括以下三類資訊: 區域性變數 執行環境 運算元棧 區域性變數用於儲存一個類的方法中所用到的區域性變數。vars暫存器指向該變量表中的第一個區域性變數。 執行環境用於儲存直譯器對Java位元組碼進行解釋過程中所需的資訊。它們是:上次呼叫的方法、區域性變數指標和運算元棧的棧頂和棧底指標。執行環境是一個執行一個方法的控制中心。例如:如果直譯器要執行iadd(整數加法),首先要從frame暫存器中找到當前執行環境,而後便從執行環境中找到運算元棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。 運算元棧用於儲存運算所需運算元及運算的結果。

碎片回收

編輯 Java類的例項所需的儲存空間是在堆上分配的。直譯器具體承擔為類例項分配空間的工作。直譯器在為一個例項分配完儲存空間後,便開始記錄對該例項所佔用的記憶體區域的使用。一旦物件使用完畢,便將其回收到堆中。在Java語言中,除了new語句外沒有其他方法為一物件申請和釋放記憶體。對記憶體進行釋放和回收的工作是由Java執行系統承擔的。這允許Java執行系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java直譯器和Hot Java環境中,碎片回收用後臺執行緒的方式來執行。這不但為執行系統提供了良好的效能,而且使程式設計人員擺脫了自己控制記憶體使用的風險。

儲存區

編輯 JVM有兩類儲存區:常量緩衝池和方法區。常量緩衝池用於儲存類名稱、方法和欄位名稱以及串常量。方法區則用於儲存Java方法的位元組碼。對於這兩種儲存區域具體實現方式在JVM規格中沒有明確規定。這使得Java應用程式的儲存佈局必須在執行過程中確定,依賴於具體平臺的實現方式。JVM是為Java位元組碼定義的一種獨立於具體平臺的規格描述,是Java平臺獨立性的基礎。JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,JVM的思想是成功的。 對比分析:如果把Java原程式想象成我們的C++原程式,Java原程式編譯後生成的位元組碼就相當於C++原程式編譯後的80x86的機器碼(二進位制程式檔案),JVM虛擬機器相當於80x86計算機系統,Java直譯器相當於80x86CPU。在80x86CPU上執行的是機器碼,在Java直譯器上執行的是Java位元組碼。Java直譯器相當於執行Java位元組碼的“CPU”,但該“CPU”不是通過硬體實現的,而是用軟體實現的。Java直譯器實際上就是特定的平臺下的一個應用程式。只要實現了特定平臺下的直譯器程式,Java位元組碼就能通過直譯器程式在該平臺下執行,這是Java跨平臺的根本。當前,並不是在所有的平臺下都有相應Java直譯器程式,這也是Java並不能在所有的平臺下都能執行的原因,它只能在已實現了Java直譯器程式的平臺下執行。

執行資料

編輯 JVM定義了若干個程式執行期間使用的資料區域。這個區域裡的一些資料在JVM啟動的時候建立,在JVM退出的時候銷燬。而其他的資料依賴於每一個執行緒,線上程建立時建立,線上程退出時銷燬。分別有程式計數器,堆,棧,方法區,執行時常量池。[3]

體系結構

編輯 JVM可以由不同的廠商來實現。由於廠商的不同必然導致JVM在實現上的一些不同,然而JVM還是可以實現跨平臺的特性,這就要歸功於設計JVM時的體系結構了。我們知道,一個JVM例項的行為不光是它自己的事,還涉及到它的子系統、儲存區域、資料型別和指令這些部分,它們描述了JVM的一個抽象的內部體系結構,其目的不光規定實現JVM時它內部的體系結構,更重要的是提供了一種方式,用於嚴格定義實現時的外部行為。每個JVM都有兩種機制,一個是裝載具有合適名稱的類(類或是介面),叫做類裝載子系統;另外的一個負責執行包含在已裝載的類或介面中的指令,叫做執行引擎。每個JVM又包括方法區、堆、Java棧、程式計數器和本地方法棧這五個部分,這幾個部分和類裝載機制與執行引擎機制一起組成的體系結構圖為:JVM的每個例項都有一個它自己的方法域和一個堆,運行於JVM內的所有的執行緒都共享這些區域;當虛擬機器裝載類檔案的時候,它解析其中的二進位制資料所包含的類資訊,並把它們放到方法域中;當程式執行的時候,JVM把程式初始化的所有物件置於堆上;而每個執行緒建立的時候,都會擁有自己的程式計數器和Java棧,其中程式計數器中的值指向下一條即將被執行的指令,執行緒的Java棧則儲存為該執行緒呼叫Java方法的狀態;本地方法呼叫的狀態被儲存在本地方法棧,該方法棧依賴於具體的實現。