Java字節碼
先介紹下c語言的編譯過程,寫好代碼用編譯器(比如gcc)編譯過后是機器能夠直接執行的二進制機器碼。
java也類似這種情況,但是java代碼文件編譯過后不是任何機器都能識別的機器碼,而是只有java虛擬機(JVM)才能識別的java字節碼。
JVM
java的虛擬機,java文件編譯后的.class文件就是運行在JVM上的。
Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。通過對中央處理器(CPU)所執行的軟件實現,實現能執行編譯過的Java程序碼(Applet與應用程序)。
作為一種編程語言的虛擬機,實際上不只是專用於Java語言,只要生成的編譯文件匹配JVM對加載編譯文件格式要求,任何語言都可以由JVM編譯運行。此外,除了甲骨文,也有其他開源或閉源的實現。
JRE
Java運行環境(Java Runtime Environment,簡稱JRE)是一個軟件,由太陽微系統所研發,JRE可以讓計算機系統運行Java應用程序(Java Application)。
JRE的內部有一個Java虛擬機(Java Virtual Machine,JVM)以及一些標准的類別函數庫(Class Library)。
JDK
JDK包含了一批用於Java開發的組件,其中包括:
javac:編譯器,將后綴名為.java的源代碼編譯成后綴名為“.class”的字節碼
java:運行工具,運行.class的字節碼
jar:打包工具,將相關的類文件打包成一個文件
javadoc:文檔生成器,從源碼注釋中提取文檔,注釋需匹配規范
jdb debugger:調試工具
jps:顯示當前java程序運行的進程狀態
javap:反編譯程序
appletviewer:運行和調試applet程序的工具,不需要使用瀏覽器
javah:從Java類生成C頭文件和C源文件。這些文件提供了連接膠合,使Java和C代碼可進行交互。[2]
javaws:運行JNLP程序
extcheck:一個檢測jar包沖突的工具
apt:注釋處理工具[3]
jhat:java堆分析工具
jstack:棧跟蹤程序
jstat:JVM檢測統計工具
jstatd:jstat守護進程
jinfo:獲取正在運行或崩潰的java程序配置信息
jmap:獲取java進程內存映射信息
idlj:IDL-to-Java編譯器。將IDL語言轉化為java文件[4]
policytool:一個GUI的策略文件創建和管理工具
jrunscript:命令行腳本運行
JDK中還包括完整的JRE(Java Runtime Environment),Java運行環境,也被稱為private runtime。包括了用於產品環境的各種庫類,如基礎類庫rt.jar,以及給開發人員使用的補充庫,如國際化與本地化的類庫、IDL庫等等。
JDK中還包括各種樣例程序,用以展示Java API中的各部分。
java收費
對於最新的jdk11
Oracle 將發布兩個不同版本,分別為 Oracle JDK 和 OpenJDK 「除了所附帶的許可文件不一樣,剛發布的版本幾乎完全相同」。
對於 Oracle JDK 來說,支持 BCL 協議,開發人員可以免費使用,但不能用於生產,如果全額付費的話,可支持到 2026 年 9 月。
對於 OpenJDK 來說,支持 GPL 協議「一般只支持到發布的前 6 個月內」,可以用於公司使用,因此,對於JDK 11 來說,應該有JDK 11.0.0,然后是兩個安全補丁 11.0.1 和 11.0.2 。如果你要繼續使用 Oracle 的 OpenJDK 構建和安全補丁,那么您將必須在發布后的一個月內遷移到 JDK 12,見如下圖綠色的部分為免費支持版本。
AdoptOpenJDK
一個非甲骨文出品的openjdk實現,支持 GPL 協議且免費。AdoptOpenJDK 開發團隊表示 JDK 11 版本將在下一個主要版本發布一年后繼續使用4年,並且他們將提供持續構建 OpenJDK 的源存儲庫中創建和發布的安全修補程序。
參考:
https://yq.aliyun.com/articles/645952
https://zh.wikipedia.org/wiki/JDK
https://zh.wikipedia.org/wiki/JRE
https://zh.wikipedia.org/wiki/Java虛擬機
https://zh.wikipedia.org/wiki/Java字節碼
https://zhuanlan.zhihu.com/p/44837223