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

转自转自官方文档

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开发,所以这个类库基本不会用到了。

dt.jar目录结构

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

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等。


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。正所谓:源码面前,了无秘密。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 由于各Linux开发厂商的不同,因此不同开发厂商的Linux版本操作细节也不一样,今天就来说一下CentOS下JD...
    imbird阅读 731评论 0 1
  • 工作之后的第一个周末前夜晚接我下班,带我去吃虾吃虾涮的火锅,开心。 自己喝了大半瓶的56°的二锅头,现在脑袋晕乎乎...
    小王子的前世今生阅读 296评论 0 0
  • 花钱雇保姆,用不做家务省下来的时间去学习自己想学习的东西,难道不是更合算吗?相同的时间,你做家务获得的东西和你学习...
    H_C阅读 251评论 0 0
  • 有人赶着时代走 要做弄潮儿 有人只想当观众 做自己的保护神 说平庸也无妨 故事里光鲜 和事故里的疲惫 总是不分彼此...
    陆乙乙阅读 156评论 0 0