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


Java|Java初学者不得不知的概念:抽丝剥茧JDK、JRE、JVM之间的区别
文章图片
Java|Java初学者不得不知的概念:抽丝剥茧JDK、JRE、JVM之间的区别
文章图片
Java|Java初学者不得不知的概念:抽丝剥茧JDK、JRE、JVM之间的区别
文章图片
Java|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)这个过程是为了保证被加载类的正确性 , 保证其它后续步骤的正确正常执行 , 验证的过程包括:
  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 【Java|Java初学者不得不知的概念:抽丝剥茧JDK、JRE、JVM之间的区别】符号引用验证
准备(Prepare)阶段 , 是为类变量分配内存并设置初始化值的 。
解析(Resolve)这个阶段是将常量池中的符号引用转换为直接引用的过程 。
直接引用和字符引用一个最明显的区别是 , 直接引用是目标是已经被加载到内存的 , 而字符引用并不一定已经加载到内存 。
初始化(Initialize)类加载的初始化阶段 , 是对类的变量和代码块执行初始化操作 , 是执行类构造器的过程 , 换句话说是对类的静态变量 , 静态代码块执行初始化操作 。
2.2、运行时数据区
运行时数据区 , 是java虚拟机定义的在程序执行期间使用的各种运行时的数据区 。 这些运行时数据区分为两种 , 一种是在java虚拟机启动时创建 , 仅在java虚拟机退出时才被销毁 , 这种可以理解为线程共享的 。
另外一种是数据区是针对每个线程的 , 是在创建线程时创建的 , 并在线程退出时销毁这个数据区 , 这种可以理解为线程私有的 。
JVM运行时数据区图例:
思维导图:Java虚拟机运行时数据区 , 虚拟机栈、本地方法栈、程序计数器是线程私有的 , 方法区、堆是线程共享的 。
2.3、 执行引擎
执行引擎主要有如下3个部分:Interpreter(解释器)、Just-In-Time (JIT) Compiler(即时 (JIT) 编译器)、Garbage Collector(垃圾收集器)
  • Interpreter
一旦类加载器加载并验证字节码 , 解释器就会逐行执行字节码 , 这个过程是比较慢的 , 一个方法被多次调用时 , 每次都要执行