JDK,JRE,JVM等基礎概念
我們通常所說的JDK,其實是指Java開發包,裡面包含Java開發用到的工具集。
JDK(Java Development ToolKit),包含了Java運作環境(JRE)和開發工具(編譯器,調試器,javadoc等)。我們就是依靠JDK來開發和運作Java程式的。
JDK的編譯器Javac[.exe],會将Java代碼編譯成位元組碼(.class檔案)。編譯出的位元組碼在任何平台上都一樣的内容,是以我們說Java語言是門跨平台語言。Write once, run anywhere。
JRE(Java Runtime Environment) ,它為Java提供了運作環境,其中重要的一環就是通過JVM将位元組碼解釋成可執行的機器碼。
JRE由JVM,Java運作時類庫,動态連結庫等組成。
JVM(Java Virtual Machine),Java虛拟機,可以看做是一台抽象化的計算機,它有一套完整的體系架構,包括處理器、堆棧 、寄存器等。
在運作時環境,JVM會将Java位元組碼解釋成機器碼。機器碼和平台相關的(不同硬體環境、不同作業系統,産生的機器碼不同),是以JVM在不同平台有不同的實作。
目前JDK預設使用的實作是Hotspot VM。
下面是JDK的體系結構圖:

轉自轉自官方文檔
OpenJDK介紹
我們平時所說的JDK,是指SUN公司(現在是Oracle公司的)的官方JDK,由于曆史遺留問題,其本身采用的并不是開源協定。是以後來有了OpenJDK----JDK的開源版本。
OpenJDK和JDK有以下幾點不同:
- 授權協定不同。 前者采用GPL協定(允許商用),後者是JRL協定(供個人研究使用)
- OpenJDK源代碼不完整。其中最主要的部份就是JMX中的可選元件SNMP部份的代碼。是以這些不能開放的源代碼 将它作成plug,以供OpenJDK編譯時使用,你也可以選擇不要使用plug。
- 部分源代碼(不是SUN産權的源碼)用開源替換
- 隻包含最精簡的JDK,不包含其他軟體包,比如Rhino Java DB JAXP
(以上摘自知乎 中的高票答案。)
我們有時候會在Java源碼中看到标記為
native
的方法,說明該方法是使用C代碼實作的。可以通過OpenJDK來看一下是如何實作的。
比如Object類的getClass方法:
public final native Class<?> getClass();
相應的,在
OpenJDK/jdk/src/share/native
目錄下,找到Object.c檔案,可以看到具體的實作代碼:
JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
if (this == NULL) {
JNU_ThrowNullPointerException(env, NULL);
return ;
} else {
return (*env)->GetObjectClass(env, this);
}
}
JDK目錄結構
那麼上面所說的JRE,JVM具體的是長啥樣的呢?我們可以通過檢視JDK的目錄檔案結構一窺真容。
下面以centos7系統下的JDK1.8版本為例,對JDK目錄結構做個說明。
JDK1.8目錄結構:
[~]$ ls -l jdk
drwxr-xr-x 月 bin
-r--r--r-- 月 COPYRIGHT
drwxr-xr-x 月 db
drwxr-xr-x 月 include
-rwxr-xr-x 月 javafx-src.zip
drwxr-xr-x 月 jre
drwxr-xr-x 月 lib
-r--r--r-- 月 LICENSE
drwxr-xr-x 月 man
-r--r--r-- 月 README.html
-rw-r--r-- 月 release
-rw-r--r-- 月 src.zip
-rwxr-xr-x 月 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 月 THIRDPARTYLICENSEREADME.txt
下面是其中比較重要的目錄或檔案的含義:
bin目錄:Java工具的可執行檔案,包括: java、Java編譯器javac、反編譯.class檔案javap、密鑰管理工具keytool、Java文檔工具javadoc等。
COPYRIGHT檔案:版權資訊。
db目錄:Java實作的資料庫。
include目錄:.h頭檔案,C語言開發時用到的頭檔案。比如
jni.h
是開發jni程式時必須引用的頭檔案。
lib目錄: Java類庫,我們經常看到的
和
dt.jar
tools.jar
就在這個目錄下。
src.zip檔案:Java類庫源碼,包括了rt.jar庫中的關鍵部分;除了Java類庫,還包含了啟動器(launcher)的源碼(C語言實作)。
jre目錄:Java運作環境。後面會展開了講它的目錄結構。
dt.jar和tools.jar檔案作用
dt.jar
包含了Swing包,是運作環境的類庫。目前的發展趨勢是Java越來越少的用作GUI開發,是以這個類庫基本不會用到了。
dt.jar目錄結構
tools.jar
是工具類庫,bin目錄下的可執行程式,好多都會用到這個類庫。比如javac[.exe],javadoc[.exe]等。
tools.jar目錄結構
平時我們經常會将這兩個檔案配置到CLASSPATH的目前目錄(
.
)後面。
原因就是有些可執行程式在運作時是依賴這些類庫的,比如javac[.exe]就依賴tools.jar類庫的javac包。
jre目錄結構
[~]$ ls -l jre
drwxr-xr-x 月 bin
-r--r--r-- 月 COPYRIGHT
drwxr-xr-x 月 lib
-r--r--r-- 月 LICENSE
drwxr-xr-x 月 plugin
-r--r--r-- 月 README
-rwxr-xr-x 月 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 月 THIRDPARTYLICENSEREADME.txt
-r--r--r-- 月 Welcome.html
bin目錄:包含了java運作所需要的可執行檔案,比如java[.exe]
lib目錄:包含了運作時依賴的java類庫和動态連結庫(.so或.dll或.dylib)。
jre/lib目錄結構:
[~]$ ls -l jre/lib
drwxr-xr-x 月 amd64
-rwxr-xr-x 月 rt.jar
.....
amd64目錄下包含了程式運作所需的動态連結庫,在amd64/server目錄下,可以找到JVM庫:
libjvm.so
。
rt.jar檔案是java運作時類庫,是我們用到最多的基礎類庫,包括java.lang,java.io,java.net,java.util等。
rt.jar目錄結構
java.lang
:Java語言包,這個包下的檔案不需要顯式import。包括:Object類,資料類型相關的類(String,Long,Byte),Class類,線程相關類Thread,異常類Throwable,等。
java.io
:I/O操作相關的類。包括:檔案類File,FileReader,FileWriter,輸入輸出流InputStream/OutputStream,等。
java.net
:網絡相關類。包括:http連接配接類HttpURLConnection,socket類,等。
java.util
:工具類。包括:資料結構相關的類ArrayList、Hashmap,日期類Date,随機數類Random,等。
我們平時用IDE在配置好JDK HOME後,IDE會預設将JDK的類庫全部引用進來,供開發使用。以mac下的Itellij IDEA為例,看一下都有那些類:
引用的jar包
後記
本文首先講了JDK相關的一些基礎概念;之後通過分析JDK的目錄結構,來加深對這些概念的了解。Java體系博大精深,像Java類庫、JVM等每個部分都值得深入研究一番,而讀源代碼是最直接見效最快的方法,強烈推薦用這種方法來學習Java。正所謂:源碼面前,了無秘密。
===================================================================================================================================
C:\Program Files\Java\jdk1.7.0_21 -- JDK的根目錄,包含一些軟體版權,聲明,和自述檔案,同時包含歸檔了的Java平台源代碼包src.zip
C:\Program Files\Java\jdk1.7.0_21\src.zip -- 歸檔的Java源代碼
C:\Program Files\Java\jdk1.7.0_21\include -- C 語言頭檔案 支援 用Java本地接口和Java虛拟機接口 來本機代碼程式設計
C:\Program Files\Java\jdk1.7.0_21\lib -- Java開發工具要用的一些庫檔案,有包含了支援JDK工具的非核心類庫tool.jar,dt.jar 歸檔的 BeanInfo 檔案,用于告訴IDE這樣顯示java元件怎樣讓開發者在自己的應用程式中使用者化它們
================C:\Program Files\Java\jdk1.7.0_21\jre================
C:\Program Files\Java\jdk1.7.0_21\jre -- JDK使用的Java運作環境(JRE)的根目錄,這個運作環境實作了Java平台
C:\Program Files\Java\jdk1.7.0_21\jre\bin -- Java平台所要用的工具和庫的可執行檔案這些可執行檔案和 /jdk1.7.0_21/bin相同的。這個路徑不需要設定 PATH 環境變量 //Java 啟動器工具充當了應用程式啟動器(覆寫了1.1版本的JDK推出的舊版本JRE工具)
C:\Program Files\Java\jdk1.7.0_21\jre\bin\client -- 包含Java Hotspot(Java性能引擎) Client Virtual Machine 客戶虛拟機要用的DLL檔案
C:\Program Files\Java\jdk1.7.0_21\jre\bin\server -- 包含Java Hotspot(Java性能引擎) Server Virtual Machine 伺服器虛拟機要用的DLL檔案 ----JDK 比 JRE C:\Program Files\Java\jre7\bin多一個server端的java虛拟機。即這個folder “Server” 不存在于JRE下。
C:\Program Files\Java\jdk1.7.0_21\jre\lib -- JRE要用的代碼庫,屬性設定,資源檔案。
C:\Program Files\Java\jdk1.7.0_21\jre\lib\rt.jar -- Java 引導類庫(java 核心APIRunTime類)
C:\Program Files\Java\jdk1.7.0_21\jre\lib\charsets.jar -- 字元轉換類庫
C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext -- 預設的Java平台擴充安裝環境
C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext\localedata.jar -- ava.text 和 java.util包要用到的地區資料
C:\Program Files\Java\jdk1.7.0_21\jre\lib\security -- 包含安全管理檔案,有安全規則(java.policy)和安全屬性檔案(java.security)
C:\Program Files\Java\jdk1.7.0_21\jre\lib\applet -- Java applets 要的Jar包,可以放到lib/applet/目錄,可以節省 applet 類裝載器從本地檔案系統裝載 大的applets 所需的applet類時間,減少從網上下載下傳具有相同的保護的時間。
C:\Program Files\Java\jdk1.7.0_21\jre\lib\fonts -- 包含平台所需的TrueType字型檔案
================C:\Program Files\Java\jdk1.7.0_21\db================
C:\Program Files\Java\jdk1.7.0_21\db -- db目錄,純Java開發的資料庫 Apache Derby,是一個開源的100%Java開發的關系資料庫
有關 Java DB 的資訊,請參見 http://developers.sun.com/prodtech/javadb/。
有關 Derby 的文檔,請參見:http://db.apache.org/derby/manuals/index.html
================C:\Program Files\Java\jdk1.7.0_21\bin================
C:\Program Files\Java\jdk1.7.0_21\bin -- JDK包含的一些開發工具執行檔案
C:\Program Files\Java\jdk1.7.0_21\bin\javac.exe -- 基本工具 - Java語言編譯器, 将Java源代碼轉換成位元組碼
C:\Program Files\Java\jdk1.7.0_21\bin\java.exe -- 基本工具 - Java應用程式啟動器,直接從類檔案執行Java應用程式位元組代碼
C:\Program Files\Java\jdk1.7.0_21\bin\javadoc.exe -- 基本工具 - Java API 文檔生成器,從源碼注釋中提取文檔
C:\Program Files\Java\jdk1.7.0_21\bin\apt.exe -- 基本工具 - java 注釋處理器
C:\Program Files\Java\jdk1.7.0_21\bin\appletviewer.exe -- 基本工具 - java applet 小程式浏覽器,一種執行HTML檔案上的Java小程式的Java浏覽器。
C:\Program Files\Java\jdk1.7.0_21\bin\jar.exe -- 基本工具 - java檔案壓縮打包工具
C:\Program Files\Java\jdk1.7.0_21\bin\jdb.exe -- 基本工具 - Java 調試器,debugger,查錯工具
C:\Program Files\Java\jdk1.7.0_21\bin\javah.exe -- 基本工具 - C 頭檔案和stub生成器,用于寫本地化方法,例如生産JNI樣式的頭檔案。産生可以調用Java過程的C過程,或建立能被Java程式調用的C過程的頭檔案
C:\Program Files\Java\jdk1.7.0_21\bin\javap.exe -- 基本工具 - class檔案反編譯工具,顯示編譯類檔案中的可通路功能和資料,同時顯示位元組代碼含義。
C:\Program Files\Java\jdk1.7.0_21\bin\extcheck.exe -- 基本工具 - 用于檢測jar包中的問題
C:\Program Files\Java\jdk1.7.0_21\bin\keytool.exe -- 安全工具 - 管理密鑰庫和證書.
C:\Program Files\Java\jdk1.7.0_21\bin\jarsigner.exe -- 安全工具 - 生産和校驗JAR簽名
C:\Program Files\Java\jdk1.7.0_21\bin\policytool.exe -- 安全工具 - 有使用者界面的規則管理工具
C:\Program Files\Java\jdk1.7.0_21\bin\kinit.exe.exe -- 安全工具 - 用于獲得和緩存網絡認證協定Kerberos 票證的授予票證
C:\Program Files\Java\jdk1.7.0_21\bin\klist.exe.exe -- 安全工具 - 憑據高速緩存和密鑰表中的 Kerberos 顯示條目
C:\Program Files\Java\jdk1.7.0_21\bin\ktab.exe.exe -- 安全工具 - 密鑰和證書管理工具
C:\Program Files\Java\jdk1.7.0_21\bin\native2ascii.exe -- Java國際化工具 - 将文本轉化為 Unicode Latin-1。詳情參考http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html
C:\Program Files\Java\jdk1.7.0_21\bin\rmic.exe -- 遠端方法調用工具 - 生成遠端對象的stubs and skeletons(存根和架構)
C:\Program Files\Java\jdk1.7.0_21\bin\rmid.exe -- 遠端方法調用工具 - Java 遠端方法調用(RMI:Remote Method Invocation) 活化系統守護程序
C:\Program Files\Java\jdk1.7.0_21\bin\rmiregistry.exe -- 遠端方法調用工具 - Java 遠端對象系統資料庫
C:\Program Files\Java\jdk1.7.0_21\bin\serialver.exe -- 遠端方法調用工具 - 傳回類的 serialVersionUID.
C:\Program Files\Java\jdk1.7.0_21\bin\tnameserv.exe -- Java IDL and RMI-IIOP 工具 - Provides access to the naming service.
C:\Program Files\Java\jdk1.7.0_21\bin\idlj.exe -- Java IDL and RMI-IIOP 工具 - 生産映射到OMG IDL接口可以使Java應用程式使用CORBA的.java檔案
C:\Program Files\Java\jdk1.7.0_21\bin\orbd.exe -- Java IDL and RMI-IIOP 工具 - 為客戶可以在CORBA環境下透明的定位和調用伺服器的穩定的對象提供支援
C:\Program Files\Java\jdk1.7.0_21\bin\servertool.exe -- Java IDL and RMI-IIOP 工具 - 為應用程式提供易于使用的接口用于注冊,登出,啟動,關閉伺服器
C:\Program Files\Java\jdk1.7.0_21\bin\pack200.exe -- Java 部署工具 - 使用java gzip壓縮工具将JAR檔案轉換為壓縮的pack200檔案,生産打封包件是高度壓縮的JAR包,可以直接部署,減少下載下傳時間
C:\Program Files\Java\jdk1.7.0_21\bin\unpack200.exe -- Java 部署工具 - 解包pack200檔案為JARs
C:\Program Files\Java\jdk1.7.0_21\bin\htmlconverter.exe -- Java 插件工具 - Java Plug-in HTML轉換器 htmlconverter -gui 可以啟動圖形界面
C:\Program Files\Java\jdk1.7.0_21\bin\javaws.exe -- Java web 啟動工具 - Java web 啟動指令行工具
C:\Program Files\Java\jdk1.7.0_21\bin\jvisualvm.exe -- Java 故障檢修,程式概要分析,監視和管理工具 - 一個圖形化的Java虛拟機,不說了 大家研究一下就發現太酷了.這是想了解JVM的人的神器http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html
C:\Program Files\Java\jdk1.7.0_21\bin\jconsole.exe -- Java 故障檢修,程式概要分析,監視和管理工具 -java監視台和管理控制台,圖形界面的功能太強大了,運作一下就知道 ,不想多說,看了就知道
C:\Program Files\Java\jdk1.7.0_21\bin\schemagen.exe -- Java web 服務工具 - Java構架的XML Schema生成器
C:\Program Files\Java\jdk1.7.0_21\bin\wsgen.exe -- Java web 服務工具 - 生成 JAX-WS
C:\Program Files\Java\jdk1.7.0_21\bin\wsimport.exe -- Java web 服務工具 - 生成 JAX-WS
C:\Program Files\Java\jdk1.7.0_21\bin\xjc.exe -- Java web 服務工具 - 綁定編譯器
C:\Program Files\Java\jdk1.7.0_21\bin\jps.exe -- 監視工具 - JVM Process Status 程序狀态工具。列出目标系統的HotSpot JJVM , 監視Java虛拟機的性能,不支援Windows 98 和Windows ME 平台
C:\Program Files\Java\jdk1.7.0_21\bin\jstat.exe -- 監視工具 - 按照指令行的具體要求記錄和收集一個JVM的性能資料
C:\Program Files\Java\jdk1.7.0_21\bin\jstatd.exe -- 監視工具 - JVM jstat 的守護程序
C:\Program Files\Java\jdk1.7.0_21\bin\jinfo.exe -- 故障檢測和修理工具 - 配置或列印某個Java程序VM flag
C:\Program Files\Java\jdk1.7.0_21\bin\jhat.exe -- 故障檢測和修理工具 - 堆儲存檢視器
C:\Program Files\Java\jdk1.7.0_21\bin\jmap.exe -- 故障檢測和修理工具 - Java記憶體圖
C:\Program Files\Java\jdk1.7.0_21\bin\jsadebugd.exe -- 故障檢測和修理工具 - Java 的 Serviceability Agent Debug的守護程序
C:\Program Files\Java\jdk1.7.0_21\bin\jstack.exe -- 故障檢測和修理工具 - Java堆棧跟蹤
C:\Program Files\Java\jdk1.7.0_21\bin\jrunscript.exe -- Java腳本工具 - 運作腳本