思维导图

文章已收录到Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
一、JVM介绍
在介绍JVM之前,先看一下.java文件从编码到执行的过程:

整个过程是,x.java文件需要编译成x.class文件,通过类加载器加载到内存中,然后通过解释器或者即时编译器进行解释和编译,最后交给执行引擎执行,执行引擎操作OS硬件。
从类加载器到执行引擎这块内容就是JVM。
JVM是一个跨语言的平台。从上面的图中可以看到,实际上JVM上运行的不是.java文件,而是.class文件。这就引出一个观点,JVM是一个跨语言的平台,他不仅仅能跑java程序,只要这种编程语言能编译成JVM可识别的.class文件都可以在上面运行。
所以除了java以外,能在JVM上运行的语言有很多,比如JRuby、Groovy、Scala、Kotlin等等。
从本质上讲JVM就是一台通过软件虚拟的计算机,它有它自身的指令集,有它自身的操作系统。
所以Oracle给JVM定了一套JVM规范,Oracle公司也给出了他的实现。基本上是目前最多人使用的java虚拟机实现,叫做Hotspot。使用java -version可以查看:

一些体量较大,有一定规模的公司,也会开发自己的JVM虚拟机,比如淘宝的TaobaoVM、IBM公司的J9-IBM、微软的MicrosoftVM等等。
二、JDK、JRE、JVM

JVM应该很清楚了,是运行.class文件的虚拟机。JRE则是运行时环境,包括JVM和java核心类库,没有核心的类库是跑不起来的。

JDK则包括JRE和一些开发使用的工具集。
所以总的关系是JDK > JRE > JVM。
三、Class加载过程
类加载是JVM工作的一个很重要的过程,我们知道.class是存在在硬盘上的一个文件,如何加载到内存工作的呢,面试中也经常问这个问题。所以你要和其他程序员拉开差距,体现差异化,这个问题要搞懂。
类加载的过程实际上分为三大步:**Loading(加载)、Linking(连接)、Initlalizing(初始化)**。
其中第二步Linking又分为三小步:**Verification(验证)、Preparation(准备)、Resolution(解析)**。

3.1 Loading
Loading是把.class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据,在堆中生成一个java.lang.Class类对象代表这个类,作为方法区这些类型数据的访问入口。
3.2 Linking
Linking简单来说,就是把原始的类定义的信息合并到JVM运行状态之中。分为三小步进行。
3.2.1 Verification
验证加载的类信息是