写点什么

Java 初学者不得不知的概念:抽丝剥茧 JDK、JRE、JVM 之间的区别

发布于: 1 小时前
Java初学者不得不知的概念:抽丝剥茧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 的类加载机制分为五个部分:加载,验证,准备,解析,初始化,如图:

所谓 JVM 加载过程,是查找和导入 class 文件,加载过程:

(1)通过类的全限定名获取这个类的二进制字节流;

(2)将字节流所代表的静态存储结构转换为方法区的运行时数据结构;

(3)在 JVM 堆中生成代表这个类的 java.lang.class 对象(作为方法区中这些数据的访问入口)

JVM 验证(Verify)这个过程是为了保证被加载类的正确性,保证其它后续步骤的正确正常执行,验证的过程包括:

  • 文件格式验证

  • 元数据验证

  • 字节码验证

  • 符号引用验证

准备(Prepare)阶段,是为类变量分配内存并设置初始化值的。

解析(Resolve)这个阶段是将常量池中的符号引用转换为直接引用的过程。

直接引用和字符引用一个最明显的区别是,直接引用是目标是已经被加载到内存的,而字符引用并不一定已经加载到内存。

初始化(Initialize)类加载的初始化阶段,是对类的变量和代码块执行初始化操作,是执行类构造器的过程,换句话说是对类的静态变量,静态代码块执行初始化操作。

2.2、运行时数据区

运行时数据区,是 java 虚拟机定义的在程序执行期间使用的各种运行时的数据区。这些运行时数据区分为两种,一种是在 java 虚拟机启动时创建,仅在 java 虚拟机退出时才被销毁,这种可以理解为线程共享的。

另外一种是数据区是针对每个线程的,是在创建线程时创建的,并在线程退出时销毁这个数据区,这种可以理解为线程私有的。

JVM 运行时数据区图例:

思维导图:Java 虚拟机运行时数据区,虚拟机栈、本地方法栈、程序计数器是线程私有的,方法区、堆是线程共享的。

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 的垃圾收集器主要用于对运行时数据区的内存进行回收整理,保证内存空间的正常使用。

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

开发工具

现在,我们将专注于各种开发工具

  • 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 堆栈跟踪,栈溢出问题排查

等等

今日份分享已结束,请大家多多包涵和指点!

用户头像

还未添加个人签名 2021.04.20 加入

Java工具与相关资料获取等WX: gsh950924(备注来源)

评论

发布
暂无评论
Java初学者不得不知的概念:抽丝剥茧JDK、JRE、JVM之间的区别