一、Java虚拟机是什么?
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java虚拟机也称为JVM(Java Virtual Machine),Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
二、为什么会有Java虚拟机?
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。
三、Java为什么能实现跨平台?
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译,因为不同的平台装有不同的JVM。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
四、内存空间
方法区:各个线程的共享区域,存放类信息、常量、静态变量。
Java堆:各个线程的共享区域,存放类实例。一个系统会产生很多类实例,所有Java堆的空间也是最大的。
如果Java堆空间不足,程序将会抛出OutOfMemoryError异常。
Java栈:每个线程的私有区域,Java栈的生命周期和线程的生命周期相同,一个线程对应一个Java栈;
每执行一个方法,就会往栈中压入一个元素,这个元素叫“栈帧”,而“栈帧”中保存了方法中的局部变量、用于存放中间状态值的操作栈等。如果栈空间不足,程序抛出StackOverflowError异常。这是因为递归太深,执行大量方法,Java栈空间太大。
本地方法栈:本地方法栈的角色和Java栈类似,只不过本地方法栈是用来表示执行本地方法的,本地方法栈保存的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。
PC寄存器(程序计数器):控制程序指令在执行(调配指令顺序)。
类加载完后,实例对象(Java堆)、方法(Java栈)、静态变量(方法区)都已经存放在对应的内存空间,此时就需要PC寄存器(程序计数器)来控制程序指令的执行了。
执行引擎:执行指令。
五、数据类型
Java语言中的所有基本类型同样也都是Java虚拟机中的基本类型。但是boolean有点特别,虽然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持,当编译器把Java源代码编译为字节码时,它会用int或者byte来表示boolean。在Java虚拟机中,false是由整数零来表示的,所有非零整数都表示true,涉及boolean值的操作则会使用int。另外,boolean数组是当做byte数组来访问的,但是在“堆”区,它也可以被表示为位域。
六、运行流程
1、Java程序代码通过编译后生成字节码文件(.class文件)。
2、通过Java HelloWorld执行,此时根据系统版本找到jvm.cfg并加载。
3、根据配置文件(jvm.cfg)找到jvm.dll,jvm.dll是jvm的主要实现。
4、接下来初始化jvm,获取JNI接口,JNI是java本地接口,用于找到.class文件并装载到jvm里。
5、最后找到main方法并执行。