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 0;
} else {
return (*env)->GetObjectClass(env, this);
}
}
JDK目录结构
那么上面所说的JRE,JVM具体的是长啥样的呢?我们可以通过查看JDK的目录文件结构一窥真容。
下面以centos7系统下的JDK1.8版本为例,对JDK目录结构做个说明。
JDK1.8目录结构:
[~]$ ls -l jdk
drwxr-xr-x 2 10 143 4096 4月 1 2016 bin
-r--r--r-- 1 10 143 3244 4月 1 2016 COPYRIGHT
drwxr-xr-x 4 10 143 4096 4月 1 2016 db
drwxr-xr-x 3 10 143 4096 4月 1 2016 include
-rwxr-xr-x 1 10 143 5092228 4月 1 2016 javafx-src.zip
drwxr-xr-x 5 10 143 4096 4月 1 2016 jre
drwxr-xr-x 5 10 143 4096 4月 1 2016 lib
-r--r--r-- 1 10 143 40 4月 1 2016 LICENSE
drwxr-xr-x 4 10 143 4096 4月 1 2016 man
-r--r--r-- 1 10 143 159 4月 1 2016 README.html
-rw-r--r-- 1 10 143 525 4月 1 2016 release
-rw-r--r-- 1 10 143 21103627 4月 1 2016 src.zip
-rwxr-xr-x 1 10 143 110114 4月 1 2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 1 10 143 177094 4月 1 2016 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开发,所以这个类库基本不会用到了。
tools.jar
是工具类库,bin目录下的可执行程序,好多都会用到这个类库。比如javac[.exe],javadoc[.exe]等。
平时我们经常会将这两个文件配置到CLASSPATH的当前目录(.
)后面。
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
原因就是有些可执行程序在运行时是依赖这些类库的,比如javac[.exe]就依赖tools.jar类库的javac包。
jre目录结构
[~]$ ls -l jre
drwxr-xr-x 2 10 143 4096 4月 1 2016 bin
-r--r--r-- 1 10 143 3244 4月 1 2016 COPYRIGHT
drwxr-xr-x 15 10 143 4096 4月 1 2016 lib
-r--r--r-- 1 10 143 40 4月 1 2016 LICENSE
drwxr-xr-x 3 10 143 4096 4月 1 2016 plugin
-r--r--r-- 1 10 143 46 4月 1 2016 README
-rwxr-xr-x 1 10 143 110114 4月 1 2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 1 10 143 177094 4月 1 2016 THIRDPARTYLICENSEREADME.txt
-r--r--r-- 1 10 143 955 4月 1 2016 Welcome.html
bin目录:包含了java运行所需要的可执行文件,比如java[.exe]
lib目录:包含了运行时依赖的java类库和动态链接库(.so或.dll或.dylib)。
jre/lib目录结构:
[~]$ ls -l jre/lib
drwxr-xr-x 4 10 143 4096 4月 1 2016 amd64
-rwxr-xr-x 1 10 143 66024286 4月 1 2016 rt.jar
.....
amd64目录下包含了程序运行所需的动态链接库,在amd64/server目录下,可以找到JVM库:libjvm.so
。
rt.jar文件是java运行时类库,是我们用到最多的基础类库,包括java.lang,java.io,java.net,java.util等。
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为例,看一下都有那些类:
后记
本文首先讲了JDK相关的一些基础概念;之后通过分析JDK的目录结构,来加深对这些概念的理解。Java体系博大精深,像Java类库、JVM等每个部分都值得深入研究一番,而读源代码是最直接见效最快的方法,强烈推荐用这种方法来学习Java。正所谓:源码面前,了无秘密。