一、JAVA體系結構
本文參考資料:
深入理解JAVA虛擬機器:JVM高階特性與最佳實踐/周志明著
JAVA虛擬機器精講/高翔龍編著
我們這裡所提到的JAVA不僅僅代表JAVA這個程式語言,而是一套強大的技術體系平臺。
JAVA被分為3種結構獨立但又彼此依賴的技術體系分支:Java SE(標準版)、Java EE(企業版)、Java ME(精簡版)。以上三種體系分支分別對應著不同的規範集合和元件:Java SE活躍在桌面領域,主要包含Java API元件;Java EE活躍在企業級領域,除了包含Java API元件,還擴充有Web元件、事務元件、分散式元件、EJB元件、訊息元件;Java ME則活躍在嵌入式領域,僅保留部分Java API元件以及適應裝置的特有元件,這也是它“精簡版”稱呼的由來。
下面我畫張圖來整理以上3種技術體系分支:
我們都知道JAVA被廣泛認可,但是為什麼呢?這是因為JAVA體系有如下不可忽視的優點:
- 擁有一門結構嚴謹、面向物件的程式語言
- 跨平臺(擺脫硬體平臺的約束) ----“Write once,Run anywhere”主8要由位元組碼支援。因為Java原始碼預設編譯結果為平臺通用的位元組碼。
- 安全性優越 ---提供了一種相對安全的記憶體管理和訪問機制,避免了絕大部分的記憶體洩露和指標越界問題
- 多執行緒
- 分散式
- 完善的應用程式介面
- 大量的第三方類庫
Java技術體系所包含的內容:
JDK與JRE的關係:
JDK:支援Java程式開發的最小環境。JDK = Java程式設計語言+Java虛擬機器+Java API類庫。
JRE:支援Java程式執行的標準環境。JRE=Java虛擬機器 +Java API類庫中的Java SE API子集 。
JAVA發展史
Java體系結構的組成:
- Java程式語言
- 位元組碼
- Java API
- Java虛擬機器
Java重要概念
首先我們理一下一個Java程式從編寫到最終執行的結構鏈路:
首先我們使用Java程式語言編寫好Java程式的原始碼,然後Java前端編譯器負責將原始碼編譯為位元組碼,接著Java虛擬機器負責將編譯好的位元組碼裝載進內部,解釋/編譯為對應平臺上的機器指令執行。
位元組碼:任何程式語言的編譯結果滿足幷包含Java虛擬機器的內部指令集、符號表以及一些其他輔助資訊的話,這個編譯結果就是一個有效的位元組碼檔案。
位元組碼的重大作用:為Java跨平臺提供了支援。正是因為原始碼編譯後為位元組碼檔案,而位元組碼檔案相較機器指令,位元組碼可以解決程式的安全性問題、跨平臺移植性問題。而且原始碼只需一次編譯,得到的位元組碼檔案可以在不同的平臺上執行。
Java API:是一些預先定義的介面,目的是提供應用程式與開發人員基於某軟體或硬體的以訪問一組例程的能力,而又不需要訪問原始碼或者理解內部工作機制的細節。
Java API的重大作用:支援平臺無關性和安全性使得Java程式適應任何應用程式。
Java虛擬機器:其主要任務為將位元組碼裝載到內部,解釋/編譯為對應平臺上的機器指令執行。
常用的虛擬機器:Sun公司的HotSpot。
HotSpot中內嵌有兩個JIT編譯器:Client Compiler 和 Server Compiler ,我們簡稱為C1和C2編譯器。其內部即時編譯器與直譯器並存,兩者協同工作,既可以保證程式的響應時間,又能提高程式的執行效能,也降低了對編譯器工作的負載。預設情況下到底有多少個位元組碼指令是通過解釋執行還是通過編譯執行,這個根據熱點探測功能來確定。熱點探測功能簡單描述為:給頻繁呼叫的方法或者方法體中有迴圈次數比較多的程式碼塊打上“熱點程式碼”的標記,對於熱點程式碼則直接使用編譯器進行編譯而不再考慮直譯器的解釋功能。
開發人員也可以手動規定HotSpot VM 進行完全解釋策略 或者完全編譯策略。
完全解釋策略:編譯器停止所有工作,位元組碼完全靠直譯器逐行解釋執行。
完全編譯策略:編譯器進行編譯工作,但是當編譯器無法進行時,直譯器可以介入執行。目的是確保程式能夠順利執行。
最後我們提一下Java的多核並行
在JDK1.5中引入了java.util.concurrent包,實現了一個粗粒度的併發框架。
在JDK1.7中對併發框架進行擴充,引入了java.util.concurrent.forkjoin包。
Frok/Join模式是處理並行程式設計的一種經典方法。
下面是Fork/Join模式的示意圖: