JDK基础概念及目录结构

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的体系结构图:

《JDK基础概念及目录结构》 转自转自官方文档

OpenJDK介绍

我们平时所说的JDK,是指SUN公司(现在是Oracle公司的)的官方JDK,由于历史遗留问题,其本身采用的并不是开源协议。所以后来有了OpenJDK—-JDK的开源版本。
OpenJDK和JDK有以下几点不同:

  1. 授权协议不同。 前者采用GPL协议(允许商用),后者是JRL协议(供个人研究使用)
  1. OpenJDK源代码不完整。其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码 将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。
  2. 部分源代码(不是SUN产权的源码)用开源替换
  3. 只包含最精简的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.jartools.jar就在这个目录下。
src.zip文件:Java类库源码,包括了rt.jar库中的关键部分;除了Java类库,还包含了启动器(launcher)的源码(C语言实现)。
jre目录:Java运行环境。后面会展开了讲它的目录结构。

dt.jar和tools.jar文件作用

dt.jar包含了Swing包,是运行环境的类库。目前的发展趋势是Java越来越少的用作GUI开发,所以这个类库基本不会用到了。

《JDK基础概念及目录结构》 dt.jar目录结构

tools.jar是工具类库,bin目录下的可执行程序,好多都会用到这个类库。比如javac[.exe],javadoc[.exe]等。

《JDK基础概念及目录结构》 tools.jar目录结构

平时我们经常会将这两个文件配置到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等。

《JDK基础概念及目录结构》 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为例,看一下都有那些类:

《JDK基础概念及目录结构》 引用的jar包

后记

本文首先讲了JDK相关的一些基础概念;之后通过分析JDK的目录结构,来加深对这些概念的理解。Java体系博大精深,像Java类库、JVM等每个部分都值得深入研究一番,而读源代码是最直接见效最快的方法,强烈推荐用这种方法来学习Java。正所谓:源码面前,了无秘密。

    原文作者:mr_franklin
    原文地址: https://www.jianshu.com/p/f98c3acd8df8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞