前言
本文简单地介绍了一下我们平常下载的JDK到底都有些什么内容,这些内容的主要作用又是什么。对于以后我们研究JVM的运行原理会有一定的帮助。
JDK目录说明
安装完jdk之后,切换至jdk的安装根目录,可以看到几个目录:bin、jre、src.zip、db、lib、include。
bin
:开发工具。里面可以看到一些我们很熟悉的工具,jar、java、javac、javadoc、javap、jconsole、jhat、jmap、jstack、jstat。jre
:Java运行时环境。JRE包括Java虚拟机(JVM),类库和其他支持执行用Java编程语言编写的程序的文件(我们开发过程中经常使用到的核心类库就是在/jre/lib
下)。src.zip
:Java类库源代码。构成Java核心API的所有类的Java编程语言源文件,(注意不是JVM源码)主要是想帮助开发人员学习和使用Java编程语言。db
:Oracle分发的Apache Derby关系数据库。lib
:其他库,开发工具所需的其他类库和支持文件,其中就有我们比较熟悉的dt.jar
和tools.jar
。include
:支持使用Java Native Interface和Java Virtual Machine(JVM)调试器接口进行本机代码编程的C语言头文件。
我们可以重点关注前面三个目录。
javac/java工具
Java源代码(.java文件)需要经过编译后(使用javac
命令),产生.Class文件,JVM才能识别并运行(使用java
命令)它,只有含有main方法的class文件才能执行。JVM针对每个操作系统开发其对应的解释器,这就是Java能Write once, run anywhere.
的原因。
JDK JRE JVM
-
JDK(Java Development ToolKit):包含了Java运行环境(JRE)和开发工具(编译器,调试器,javadoc等)。我们就是依靠JDK来开发和运行Java程序的。
-
JRE(Java Runtime Environment) :JRE是指java运行环境。光有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
-
JVM(Java Virtual Machine):Java虚拟机,在运行时环境,JVM会将Java字节码解释成机器码。机器码和平台相关的(不同硬件环境、不同操作系统,产生的机器码不同),所以JVM在不同平台有不同的实现。
如果仅需要运行Java程序(执行.class文件),只利用jre就能完成(jre里有运行.class的java.exe)。
C/C++ 中的动态链接库
库:库是写好的现有的,成熟的,可以复用的代码。一般分为动态库与静态库。
- 静态库:在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。
- 动态库:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。
PS:Windows系统的动态库是DLL
文件,Linux系统是so
文件,macOS系统的动态库则使用dylib
文件作为动态库。
JVM 以什么形式存在
我们知道 JVM 是使用C/C++语言实现,它是以
动态链接
的形式存在于jre中。MAC系统下/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/server/libjvm.dylib
就是JVM本体了。
java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows),这个动态连接库才是java虚拟机的实际操作处理所在。
OpenJDK OracleJDK
我们平常在oracle官网下载的JDK,是OracleJDK经过编译之后的Java开发运行工具集合。但是OracleJDK并不开源,如果我们想编译自己的JDK,可以选择下载OpenJDK的源码,然后自己编译,编译完之后就可以像平常在官网下载的JDK一样地使用它。可以大致的理解为,OpenJDK经过编译之后的JDK与OracleJDK基本是一致的。