一、虚拟机的作用
虚拟机(Virtual Mechine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
虚拟机的分类:
- 系统虚拟机:提供一个可以运行完整操作系统的完整系统平台
- 程序虚拟机:为运行单个计算机程序设计,支持单个进程
二、Java虚拟机概述
Java虚拟机(Java Virtual Mechine,简称JVM)是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有完善的硬件架构(处理器、堆栈、寄存器等)和相应的指令系统。
image.png
引入JVM后,Java在不同平台上运行时不需要重新编译,JVM屏蔽了与具体平台相关的信息,使得Java只需生成在JVM上运行的目标代码(字节码),就可以不加修改地运行。JVM执行字节码时,会把字节码解释成具体平台上的机器指令执行。
2.1JVM的数据类型
image.png
image.png
JVM的实现会拒绝执行违法类型规定的字节码程序。从JVM支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,使得各种JVM的实现对数据的解释相同,从而保证Java的与平台无关性和可移植性。
2.2 JVM体系结构
JVM由以下5部分组成:
- 一组指令集
JVM支持大约248个字节码,每个字节码执行一种基本的CPU运算。
Java指令集相当于Java程序的汇编语言。Java指令集中的指令包含一个单字节的操作符(指定要执行的操作)以及0或多个操作数(提供操作所需的参数或数据)。
JVM内层循环执行过程如下:
do {
取一个操作符字节;
根据操作符的值执行一个动作;
} while(程序未结束)
- 一组寄存器
JVM的寄存器用于保存机器的运行状态,都是32位,分为4种:- pc:Java程序计数器
- optop:指向操作数栈顶端的指针
- frame:指向当前执行方法的执行环境的指针
- vars:指向当前执行方法的局部变量区的第一个变量的指针
JVM是栈式的,不定义或使用寄存器来传递或接收参数,保证指令集的简洁性和实现时的高效性。
- 一个栈
JVM的栈分为3个区域:- 局部变量区:每个Java方法使用一个固定大小的局部变量集,按照与vars寄存器的字偏移量来寻址。局部变量都是32位(长整数或双精度浮点数占两个局部变量的空间)
- 运行环境区:该区包含的信息可以实现:
-
动态链接:
image.png -
正常的方法返回
image.png 异常和错误传播
-
- 操作数栈区:机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。
- 一个无用单元收集堆(Garbage-collected-heap)
Java的堆是一个运行时数据区,类的实例从中分配空间。Java具有无用单元收集能力,即不给程序员显示释放对象的能力。 -
一个方法区域
方法区保存方法代码(编译后的Java代码)和符号表。
image.png
2.3 JVM的生命周期
JVM的天职时负责运行一个Java程序,在启动一个Java程序的同时会生成一个JVM实例,当该程序退出时,JVM实例也随之消亡。JVM实例通过调用某个初识类的main方法来运行一个程序,这个main方法必须时public、static、返回值为void,并且接收一个字符串数组作为参数。
JVM内部有两种线程:守护线程和非守护线程。只要还有非守护线程在运行,那么Java程序也在继续运行。当所以非守护线程都终止时,JVM实例将自动退出。