JVM、JRE与JDK的关系

最开始学 Java 的时候不是很在意这些比较基础的东西,只是知道怎么使用。现在学得有些日子了,虽然也不是很清楚底层的具体实现,但是对于整个体系的搭建大致有了一些了解。最近由于找到工作了比较松懈,而且也在考驾照,所以有些日子没学习了。今天一时想起,把之前的笔记整理了一下,顺便加深下自己的印象。

下面我就按 JVM、JRE、JDK 顺序分别进行说明。


JVM(Java Virtual Machine),即Java虚拟机

JVM 是 JRE 的一部分,它相当于一个在真实的计算机上模拟出来的虚拟计算机。JVM 拥有完善的硬件架构,如处理器、堆、栈、寄存器等。

Java 是平台无关的语言,它就是通过 JVM 实现了不同平台上的运行。要想在不同的操作系统上运行Java程序,就需要在不同操作系统上安装对应的 JVM。所以,JVM有Windows版本、MAC版本、Linux版本之分。

以 Windows 平台为例,运行一个 Java 程序,首先需要将 Java 源代码编译成 .class 文件,也就是字节码的形式。然后解释器按照 JVM 在 Windows 系统上的实现规则将字节码解释(或者说翻译)成 Windows 平台上的机器码,然后再交由 Windows 操作系统进行执行。


JRE(Java Runtime Environment),即 Java 运行时环境

JRE 包括了 JVM、运行 Java 程序所需的核心类库和相关的支持文件,所有 Java 程序都要在 JRE 这个环境下才能运行。

普通用户由于多数并不熟悉计算机程序,所以他们需要的是傻瓜式的操作,安装上就能用。单独的 JRE 默认安装在 C:\Program Files\Java\jre1.8.0_66 路径,安装时会将版本信息写入注册表,同时也会创建 C:\ProgramData\Oracle\Java\javapath 路径,并在此路径生成 java.exe、javaw.exe、javaws.exe 这几个工具的快捷方式,并在系统环境变量 Path 的最前面加上 C:\ProgramData\Oracle\Java\javapath;,这也就意味着用户安装完 JRE 时一切都已经配置到位,然后他们就可以直接运行 Java 程序了。

如果用户想安装多套 JRE,那么会怎么样呢?

用户在安装第一套 JRE 的时候会自动创建 javapath 目录并向环境变量 Path 中写入该路径,而安装第二套、第三套的时候并不会重复写入环境变量,个人理解是第一次安装的 JRE 具有优先权,后面安装 JRE 时并不会修改环境变量,只是将版本信息写入了注册表,以便系统查找 JRE 使用,并且会将第一次安装的 JRE 中的 java.exe、javaw.exe、javaws.exe 拷贝到 C:\Windows\System32。

那么系统又是怎么决定使用哪套 JRE 的呢?

首先,用户运行程序时系统会在环境变量 Path 中依次查找路径中是否包含  java.exe、javaw.exe、javaws.exe 这三个可执行文件,将第一个匹配的路径作为它们的执行目录。

然后,查找 JRE 所在的路径:

1、在前边匹配到的目录所在的路径进行查找,若没有找到则

2、前往其上一级目录进行查找,若依旧没找到则

3、前往注册表 HKEY_LOCAL_MACHINE\Software\Javasoft\Java Runtime Environemt 表项下查看 CurrentVersion 对应的 JRE 版本,然后通过对应 JRE 的版本找到对应的JRE 目录。若这一步也失败则只能很遗憾地宣布,程序无法运行。

倘若前面一切顺利,接下来就能成功运行 Java 程序了。


JDK(Java Development Kit),即Java开发套件

安装 JDK 时会提供三个功能选项。 

“开发工具”这个选项是为开发人员准备的,会提供编译、调试以及运行等工具,另外还有一个专用的 JRE,位于JDK 安装目录下 jre 子目录;


“源代码”这一选项则是安装包含 Java 的公共 API 的类的源代码;


“公共 JRE” 如同前面所说,是面向用户的。


通过上面的图片可以看到,默认安装 JDK 时会在机器上安装两套 JRE。位于 C:\Program Files\Java\jdk1.8.0_66\jre 那一套面向开发人员,而位于 C:\Program Files\Java\jre1.8.0_66 那一套则面向普通用户(只提供了运行 Java 程序的环境,不包括其开发环境)。

JDK 安装目录下的 bin 子目录中是 SUN 公司提供的一些工具,如 javac.exe、jar.exe,而这些工具几乎都是用 Java 语言写的,比如 javac.exe 所用到的工具就放置在 \lib\tools.jar 里面,这可以通过下面这个例子进行验证:

先将 tools.jar 重命名为 tool.jar,然后运行 javac 命令,这时候会出现如下提示:

错误: 找不到或无法加载主类 com.sun.tools.javac.Main

这句话我们可以理解为输入 javac 与 输入 java -cp C:\Program Files\Java\jre1.8.0_66\lib\tools.jar com.sun.tools.javac.Main 是等价的,可见 javac 只是一个包装器,它存在的目的应该只是为了减少开发者输入命令的长度,避免输入错误提高开发效率。

鉴于上面的原因,运行这些工具也就需要一个运行时环境——即 JRE,JDK 安装目录下的 jre 子文件夹就提供了这样一个专用的运行时环境来确保 JDK 安装目录下 bin 子目录里的工具正常运行,这也就是 JDK 安装目录下为什么会有一个 jre 子文件夹的原因。

同时,由于这个 jre 同样也可以完成单独的 JRE 所提供的功能,所以 Java 开发人员只需要安装 JDK 而并不需要安装单独的 JRE。


下边就对上面所讲的进行一个简单的总结:

JVM 是 Java 语言跨平台的核心;

JRE 是运行 Java 程序的必需环境;

JDK 是面向开发人员的,并且自带一个专用 JRE。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值