JDK、JRE、JVM之间的区别

深坑

写这文章是原因是看到一道java面试题有些不了解他们3个之间的区别。

什么是 Java Development Kit(JDK)?

JDK通常用来开发Java应用和插件,基本上可以认为是一个软件开发环境,JDK包含Java Runtime Environment(JRE)、JRE包含加载/解释权、编译器(javac),文档生成器(Javadoc), 打包功能(jar)和其他在开发中所需要功能:

  • 加载代码
  • 校验代码
  • 执行代码
  • 提供运行时环境

什么是Java Runtime Environment(JRE)

Java Runtime Environment(JRE)又称为Java RTE,JRE中包含核心类和支持文件。它还包含JVM,JVM会提供运行时环境。

  • 确定JVM运行的特定类型,其类型主要由Sun和其它的几个机构提供。
  • 其实现是一个满足JVM特定前提条件的客户端程序。
  • 运行时实例无论如何运行Java类,都会产生JVM。
  • JDK一个物理存在的工具包,他包含JRE和其它工具。

什么是Java Virtual Machine(JVM)

JVM为执行Java字节码提供一个运行环境,它是一个抽象的、独立于平台运行的机器,它的实现主要包含三个部分,描述JVM实现规格的文档,具体实现和满足JVM要求的计算机程序以及实例(具体执行java字节码)。

JVM的主要任务包括:
  • 加载代码
  • 效验代码
  • 执行代码
  • 提供运行时环境

JDK、JRE和JVM之间的区别

JRE的组成

  • 部署机制: Java Web Start,Java插件等
  • UI工具包: AWT,Swing,Java2D等
  • 集成库: IDL,JDBC,RMI等
  • 其他基础库: I/O,JNI,JMX等
  • Lang和utils基础库: lang,util, 格式化, 序列化, 打包等
  • JVM: java HotSpot 客户端和服务端虚拟机

JRE功能

为了了解JRE的功能,可以看一下是如何加载Example.class这个类的。该类先被转化为一组字节码并放入.class文件中。

Java ClassLoader

ClassLoader 将执行程序所需的每个重要类放入堆栈中。它通过命名系统来提供彼此之间的安全性,源码可以来自于硬盘、系统、其他来源。

Java字节码校验器

JVM通过字节码校验检查格式并找出非法代码,校验器让JVM执行代码够快,以及这段代码不会损害现存的框架。

Java解释器

解释器有两个功能:

  • 执行字节码
  • 正确调用隐藏的设备