JVM系列之JDKJREJVM的区别是什么?
Posted smileNicky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM系列之JDKJREJVM的区别是什么?相关的知识,希望对你有一定的参考价值。
系列博客专栏:
文章目录
JVM系列之JDK、JRE、JVM的区别是什么?
1、JDK、JRE、JVM的关系
引用oracle官网对JDK的概述,里面很明确指出jdk、jre、jvm的关系,jdk是包括jre的,而jvm是jre是一部分
JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language. Note that the JRE includes components not required by the Java SE specification, including both standard and non-standard Java components.
引用官网的图片进行描述:
2、什么是Java virtual machine(JVM)?
JVM:java virtual machine,java虚拟机是执行 Java 程序的虚拟机的实现,是一个抽象的计算机器。
既然是按照计算机的理论设计的,那就遵循冯诺依曼计算机结构
JVM运行过程涉及的组件:
- 类加载器
- 运行时数据区
- 执行引擎
引用Oracle官网的图例表示HotSpot JVM的架构设计:如图首先java文件经过javac编译成class类文件,经过类加载器,加载到JVM,再通过执行引擎执行。HotSpot JVM支持高并发和拓展性也很好。
JVM的高性能是由支持并发的垃圾收集器和动态JIT编辑器保证的。HotSpot JVM JIT 编译器在 Java 应用程序运行时做出动态优化决策,并生成针对底层系统架构的高性能本地机器指令
HotSpot JVM的高移植性, Write Once Run Anywhere:
ok,现在比较详细介绍HotSpot JVM运行过程需要的3个重要组件类加载器、运行时数据区、执行引擎
2.1、 类加载器
JVM的类加载机制分为五个部分:加载,验证,准备,解析,初始化,如图,详情可以参考我之前的博客
2.2、运行时数据区
运行时数据区,是java虚拟机定义的在程序执行期间使用的各种运行时的数据区。这些运行时数据区分为两种,一种是在java虚拟机启动时创建,仅在java虚拟机退出时才被销毁,这种可以理解为线程共享的。另外一种是数据区是针对每个线程的,是在创建线程时创建的,并在线程退出时销毁这个数据区,这种可以理解为线程私有的。
比较详细的可以参考我之前博客,JVM系列之运行时数据区(Run-Time Data Areas)
2.3、 执行引擎
执行引擎主要有如下3个部分:Interpreter(解释器)、Just-In-Time (JIT) Compiler(即时 (JIT) 编译器)、Garbage Collector(垃圾收集器)
- Interpreter
一旦类加载器加载并验证字节码,解释器就会逐行执行字节码,这个过程是比较慢的,一个方法被多次调用时,每次都要执行 - Just-In-Time (JIT) Compiler
JVM 自动监视正在执行的方法。一旦一个方法符合 JIT 编译的条件,它就会被JIT编辑器编译成机器代码。这种方法被称为热方法。这个编译过程发生在单独的JVM线程上。编译成机器码后,程序运行速度是更快的。 - Garbage Collector
JVM的垃圾收集器主要用于对运行时数据区的内存进行回收整理,保证内存空间的正常使用,比较详细的JVM垃圾回收机制可以参考我之前博客:JVM系列之垃圾回收机制(Garbage Collect)
3、什么是Java Runtime Environment(JRE)?
Java 运行时环境 (JRE) 是一组用于运行 Java 应用程序的软件组件
JRE 的核心组件包括:
- JVM
- 运行 Java 程序所需的类
- 属性文件
JVM上一节已经做了比较详细的描述,所以这里只介绍运行 Java 程序所需的类和属性文件
3.1、运行 Java 程序所需的类
-
Bootstrap 类
Bootstrap class可以翻译为引导类,放在 jre/lib/路径下面,这里类在Bootstrap ClassLoader启动时候就会被加载- rt.jar 运行时类
- i18n.jar 国际化类
- charsets.jar 字符转换用
- 等等
-
extension类
extension class,也即拓展类,放在jre/lib/ext/路径下面,可以将自定义的jar放在此路径
包括的类: jfxrt.jar (JavaFX 运行时库)、localedata.jar(包括java.text和java.util)、等等 -
jre/lib/security 安全管理
-
jre/lib/applet 放置小程序支持类的目录
-
jre/lib/fonts 字体相关文件
-
等等
3.2、 属性文件
属性文件位于/jre/lib/内的不同文件夹中
- calendar.properties 日历配置
- logging.properties 日志配置
- net.properties 中的网络配置
- /jre/lib/deploy/ 中的部署属性
- /jre/lib/management/ 中的管理属性
- 等等
4、什么是Java Development Kit (JDK)?
Java Development Kit (JDK) 提供用于开发、编译、调试和执行 Java 程序的环境和工具。
JDK的核心组件包括:
-
JRE
-
开发工具
现在,我们将专注于各种开发工具 -
基本工具,整理自https://www.baeldung.com/jvm-vs-jre-vs-jdk
- javac –将java文件编译成class类文件
- java – 启动 Java 应用程序
- javadoc – 从 Java 源文件生成 API 文档(html 页面)
- apt – 根据指定源文件集中的注释查找并执行注释处理器
- appletviewer – 使我们能够在没有 Web 浏览器的情况下运行 Java 小程序
- jar – 将 Java 小程序或应用程序打包到单个存档中,可以用于运行jar文件
- jdb – 用于查找和修复 Java 应用程序中的错误的命令行,调试工具
- javah – 从 Java 类生成 C 头文件和源文件
- javap – 反汇编class类文件,并显示有关类文件中存在的字段、构造函数和方法的信息
- extcheck – 检测目标 Java 存档 (JAR) 文件和当前安装的扩展 JAR 文件之间的版本冲突
-
安全工具
java是有提供一些安全的授权证书的,Java Keystore 是授权证书或公钥证书的容器。因此,它经常被基于 Java 的应用程序用于加密、身份验证和通过 HTTPS 提供服务。- keytool – 加密密钥和证书
- jarsigner – 使用密钥库信息生成数字签名的 JAR 文件
- policytool – 管理外部策略配置文件
-
监控和性能分析
- jconsole –提供一个图形控制台,让您监控和管理 Java 应用程序
- jps –列出目标系统上检测的 JVM
- jstat –监控 JVM 统计信息
- jstatd –监控已检测的JVM
- info – 为指定的 Java 进程生成配置信息
- jmap –打印指定进程的共享对象内存映射或堆内存详细信息
- jsadebugd –附加到 Java 进程并充当调试服务器
- jstack –打印Java 堆栈跟踪,栈溢出问题排查
-
等等
5、附录:参考资料
以上是关于JVM系列之JDKJREJVM的区别是什么?的主要内容,如果未能解决你的问题,请参考以下文章