浅谈JDK、JRE、和JVM之间的关系

123 阅读4分钟

基本概念

JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。JDK不仅包括开发者需要的开发者环境,同时包括有程序运行所需要的支持环境JRE。
JRE(Java Runtime Environment) ,它为Java提供了运行环境,其中重要的一环就是通过JVM将字节码解释成可执行的机器码。
JVM(Java Virtual Machine),Java虚拟机,它通过虚拟化技术模拟出一个基本的计算机。它有一套完整的体系架构,包括处理器、堆栈 、寄存器等。在运行时环境,JVM会将Java字节码会根据相应的平台编译成其特有的机器码,所以JVM在不同平台有不同的实现。目前JDK默认使用的实现是Hotspot VM。
关于JDK安装配置步骤,请参考本人JAVA专栏第二篇文章史上最全的JDK安装及其环境变量设置

基本架构图

下图来源于JAVA官方文档,下面我们将从上向下对于整个体系结构进行解析:
在这里插入图片描述
1、JAVA language
首先是JAVA language,这个模块主要提供java的基本语法,也称其为java编程语言。
2、Tools和Tool API
我们介绍一些工具和工具的程序口(APIs),其中javac为编译程序,可以在CMD中将.java程序编译成.class文件;java语句可以执行编译后的.class文件。jar是Java归档文件格式(Java Archive, JAR)能够将多个源码、资源等文件打包到一个归档文件中。javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。javaDB是java与数据库相关指令。
3、Deployment
Deployment分为两个部分,这一层均与web网络相关。
4、User Interface和Toolkits
这一部分主要有支持图形化2D、提供 Java GUI 编程(图形界面设计)的工具包(类库)的Swing 包、打印设备和音频支持等与用户交互的音视频输出等输出。Alan cooper(VB程序语言设计之父)提出了交互式程序设计语言的概念,Windows区别于其他操作系统,其最大的区别在于Windows具有很好的用户交互特性。这一层的jdk为程序的图形h化提供程序接口(API)。
5、Integration Libraies
首先这一层提供了IDL接口描述语言用于描述接口状态,JBDC主要为程序链接数据库提供相应的接口、JNDI是一个应用程序设计的API等。这一层主要用于程序的跨平台接入,并为这些程序的跨平台接入提供了相应的程序接口API。
6、Other Base Libraies
这一部分提供了其他的基础程序的程序接口(方法),例如用来进行调用C语言的JNI、时间与日期FDate and Time 、安全Security和输入输出input/output等。
7、lang and util
这一层主要封装lang and util包的基本方法,包括数学库math、文件打包JAR、文件压缩zip等。
8、JAVA virtual Machine
JAVA虚拟机,这利用虚拟化技术,为上述的基本方法提供相应的软硬件基础。

JVM

JVM是利用虚拟化技术制作的虚拟计算机。下图是JVM的工作原理:

在这里插入图片描述
Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。执行 Java 代码首先需要使用类加载器将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。
在虚拟机中,方法区和堆为线程共享,也是垃圾回收的重点照顾区域。栈空间为线程私有,基本不会出现垃圾回收。
Java 虚拟机将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器(程序计数器)。
在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧(栈的一片区域),用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。