Java虚拟机基础知识汇总 (一)

本文总结了我在学习过程中遇到的JVM相关知识,都是最基本的介绍,作为自我总结,也希望能对看到本博客的你带来帮助~

1. Java虚拟机

Java虚拟机(Java Virtual Machine,JVM)是一种能够运行Java字节码的虚拟机,它有完善的硬件架构和相应的指令系统。
Java字节码是Java虚拟机执行的一种指令格式,Java源文件经过编译器,能够被编译成被Java虚拟机执行的字节码文件。

下图能够很好的描述JVM的地位:
这里写图片描述

2. Java为什么是与平台无关的语言?

JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的二进制字节码,JVM就可以将其“翻译”成所对应硬件平台能够执行的代码,就可以在多种平台上运行。

注:类加载器执行引擎运行时数据区是JVM的重要组成部分,在对JVM进行了基本解释之后,下面的问题围绕它们三者展开。


3. Java类的加载过程

把Java类动态加载到Java虚拟机的内存空间中的,类的加载过程如下,即:装载——>链接(验证、准备、解析)——>初始化,这就是类的加载机制,如下图所示:

这里写图片描述

  • 装载:把类的二进制文件加载到JVM的内存中。
  • 验证:确保被加载类的正确性。
  • 准备:为类的静态变量分配内存,并将其初始化为默认值。
  • 解析:把类的符号引用转换为直接引用。
  • 初始化:为类的静态变量赋予正确的初始值。

4. Java类的加载的动态性体现

Java程序启动时,并不是把所有的类一次性加载后再运行,而是总把保证程序运行的基本类先一次性加载到JVM的内存中,其他类等到JVM用到的时候再加载,这样的好处是节省了内存的开销。

5. Java类加载器

Java类加载器负责把Java类动态加载到Java虚拟机的内存空间中,此外,它还用于确定一个类。对于任意的一个类,它由这个类本身和加载它的类加载器共同确定其在JVM中的唯一性。主要的Java类加载器有三个:

  • Bootstrap ClassLoader:复杂加载JVM的核心类库,无法直接引用。
  • Extension ClassLoader:复杂加载JRE的扩展目录中的jar包,其父类是Bootstrap。
  • App/System ClassLoader:复杂加载环境变量classpath所指的目录中的类,是应用最广泛的类加载器,是用户自定义加载器的默认父类加载器,其父类是Extention。

它们的派生关系如下图所示:

这里写图片描述

6. 双亲委派模型

Java类的加载采用双亲委派模型:若一个类加载器收到类加载请求,它首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器完成,每一层都是如此,所以所有请求都会传送到顶层父类Bootstrap ClassLoader,如果父类加载器可以完成该类的加载任务,那么就成功返回,如果父类加载器无法完成此任务时,才自己去加载。它的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。

7. JVM和物理机的执行引擎的区别

JVM和物理机都有代码执行能力,但是它们的执行引擎的工作方式是不同的:

  • 物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面的;
  • JVM的执行引擎建立在处理器、硬件和操作系统层面之上,是由JVM自己实现的,因此可以制定指令集和执行引擎的结构体系,从而执行那些不能被硬件直接支持的指令格式。

未完待续,见Java虚拟机基础知识汇总 (二)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/gxx_csdn/article/details/79187294