問題
- java 是一門多範式的語言,你知道麼?它支持哪些編程範式?
- JRE 和 JDK 分別指什麼?它們的關係是咋樣的?
- 爲什麼安裝 JDK 的時候會安裝兩個 JRE?
- Java8 到 Java13 都有哪些重大變化?JRE從哪個版本開始退出歷史舞臺,原因是什麼?
- OpenJDK 和 Oracle JDK 有啥區別?
目標
對 Java 發展、主要特性、構成有一個基本的瞭解。
Java 是多範式的語言
- 傳統 Java 是解釋型的語言,現在的 JIT、AOT 技術,讓 Java 也支持了編譯型語言的特性;
- 傳統 Java 是面向對象的語言,JDK8 引入 Lambda,讓 Java 支持函數式編程範式。
- 傳統 Java 是命令式編程範式,JDK9 引入 Flow,讓 Java 更好的支持響應式編程範式;
基礎概念
Java SE:Java Platform Standard Edition
JRE:Java Runtime Environment
JDK:Java Development Kit
JVM:Java Virtual Machine
看這張圖,上面的關係應該非常清晰了。
注:從 Java 9 開始上面的圖沒有了。
java 版本發佈時間
- JDK 1.0 - January 23, 1996
- JDK 1.1 - February 19, 1996
- J2SE 1.2 - December 8, 1998
- J2SE 1.3 - May 8, 2000
- J2SE 1.4 - February 6, 2002
- J2SE 5.0 - September 30, 2004
- Java SE 6 - December 11, 2006
- Java SE 7 - July 28, 2011
- Java SE 8 (LTS) - March 18, 2014:Lambda
- Java SE 9 - September 21, 2017:Java 模塊系統、HTTP2、JShell、Reactive Streams、G1 爲默認 GC。
- Java SE 10 - March 20, 2018:並行 G1
- Java SE 11 (LTS) - September , 2018:ZGC
- Java SE 12 - March 19, 2019:Shenandoah GC
- Java SE 13 - September 17, 2019
注:從 Java 9 開始每半年一個版本,每三年一個 LTS
答疑
JDK 和 JRE 的關係是什麼?
JDK 包含了 JRE,上圖說明了一切。最明顯的區別就是編譯java 程序使用的 javac 只有jdk 有,jre 沒有, jre 只能運行 java 程序但是不能編譯 java 代碼。
爲什麼安裝 JDK 的時候會安裝兩個 JRE?
首先必須理解 JRE 和 JDK 的關係。在此基礎上,運行普通的 Java 程序,必須依賴 JRE,而 JDK 是可選的。
jdk/bin 下包括 java 開發工具。而 jdk/jre/bin 下只包含 java 運行的工具。前面是後面的超集。
JRE從哪個版本開始退出歷史舞臺,原因是什麼?
java11開始,Oracle和openJDK就不再有JRE這個單獨的文件夾了。你直接下載使用JDK就好了。
JRE 最初存在的部分原因是爲了支持 applet 和 swing,但是這些目前已經基本處於無用的狀態,而且給 java 新的發展帶來了很大的包袱。從 Java9 開始出現了jigsaw,用 Jlink 可以從 jmods 定製更小的自定義 runtime,plugin之類的也逐漸退役了,並不是不需要 jre 了,而是安裝的時候自帶 jre 的需求在降低。
Java8 到 Java13 都有哪些重大變化?
後續我會專門一篇文章說明。
OpenJDK 和 Oracle JDK 有啥區別?
維度 | Oracle JDK | OpenJDK |
---|---|---|
協議 | Java11之前爲 BCL,Java11 開始GPLv2 + CPE | GPLv2 |
開發 | Sun Microsystems Inc. | Oracle, OpenJDK & Java社區 |
性能 | 一樣 | 沒有區別 |
發佈週期 | Java10開始每6個月,有LTS爲三年支持 | 每版本6個月 |
速度 | 一樣 | 一樣 |
操作系統 | Supports Windows, Linux, Solaris, MacOS | FreeBSD, Linux, Microsoft Windows, Mac OS X |
注:從 Java11 開始商業特性Flight Recorder, Java Mission Control, 和 Application Class-Data Sharing、ZGC可以在 OpenJDK 使用了。