第一个问题:JVM是什么?

JVM是java程序运行的虚拟机,由于java不能直接被计算机CPU所识别和执行,所以需要JVM来把java程序编译为机器可以识别和运行的代码。

JVM本身也具备解释和执行java程序的能力,也就是JVM解释器的能力,因为JVM本身有程序技计数器、虚拟机栈、方法区,可以根据java程序指令来进行数据运算,相当于模拟实现了CPU的功能。

备注:其实在JVM并不直接接触java代码,而是java字节码,java代码需要先编译为java字节码才能被JVM所识别和使用。另外,即使是其他语言编写的代码,也可以通过编译为java字节码,然后被java虚拟机所使用。

第二个问题:JVM是用来解决什么需求的?

JVM的诞生是为了实现Java程序“一处编写,到处运行”的目的,这样程序员的负担就大大减轻。JVM通过自己的代码兼容了不同的操作的操作系统和机器硬件,得以把便利带给了程序员。JVM上可以直接解释运行Java字节码,也可以把java字节码编译为机器码被本地CPU所执行。

第三个问题:JVM具备什么样的能力?

image.png

JVM既然可以执行java代码,那么就具备通过数据(局部变量、类成员变量等)和指令(流程控制、运算等)和进行运算的能力,另外还要具备存储数据的能力。由于java是面向对象的编程语言,java代码中主要信息都是编写在类中的,所以在实际运行java程序之前,需要把类中的相关信息给识别出来,在java程序实际执行的过程中,就可以使用类中的数据和指令进行运算了。在java程序执行的过程中,不可避免地要产生很多新数据(堆中的类对象、方法区中的类型信息、方法信息、域信息、运行时常量池等),随着这些数据的不断增多,会造成内存不够用的情况,而在这些数据中有很多是一次性用过就不再使用的数据,所以需要进行清理以回收内存被重新使用。

以上过程涉及到的JVM能力有:
1、控制器的能力(根据程序指令控制运算过程的能力):程序计数器
2、储存器的能力(储存数据的能力):堆和方法区
3、运算器的能力(进行实际运算的能力):执行引擎(解释器)、虚拟机栈(局部变量表、操作数栈)存疑
4、内存分配和回收的能力(进行内存分配和内存清理能力):执行引擎(垃圾回收器)
5、JVM运行环境初始化的能力(加载和解析类型信息、方法信息、域信息等):类加载器

另外:
JVM除了可以解释执行Java字节码,还可以把java字节码编译为机器码,通过本地CPU进行执行。而且,JVM还可以执行C和C++的代码来使用java不具备而C/C++具备的能力(比如:和操作系统底层进行交互、和硬件进行交互)。所以JVM的能力还有:

6、编译器的能力(把java字节码编译为本地机器码):执行引擎(JIT编译器)、方法区的机器码缓存
7、执行C/C++代码的能力:本地方法接口、本地方法库、本地方法栈

综上所述:
JVM所具备的能力:控制器、储存器、运算器、内存分配和回收、JVM运行环境初始化、编译器、执行C/C++代码;
支撑这些能力的功能有:类加载器、运行时数据区【程序计数器、堆、方法区、虚拟机栈(局部变量表、操作数栈、本地方法栈】、执行引擎(解释器、JIT编译器、垃圾回收器)、本地方法接口、本地方法库。