一、Java虚拟机是什么?

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java虚拟机也称为JVM(Java Virtual Machine),Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

二、为什么会有Java虚拟机?

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。

三、Java为什么能实现跨平台?

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译,因为不同的平台装有不同的JVM。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

四、内存空间

浅谈Java虚拟机(JVM)

方法区:各个线程的共享区域,存放类信息、常量、静态变量。

Java堆:各个线程的共享区域,存放类实例。一个系统会产生很多类实例,所有Java堆的空间也是最大的。

如果Java堆空间不足,程序将会抛出OutOfMemoryError异常。

Java栈:每个线程的私有区域,Java栈的生命周期和线程的生命周期相同,一个线程对应一个Java栈;

每执行一个方法,就会往栈中压入一个元素,这个元素叫“栈帧”,而“栈帧”中保存了方法中的局部变量、用于存放中间状态值的操作栈等。如果栈空间不足,程序抛出StackOverflowError异常。这是因为递归太深,执行大量方法,Java栈空间太大。

本地方法栈:本地方法栈的角色和Java栈类似,只不过本地方法栈是用来表示执行本地方法的,本地方法栈保存的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。

PC寄存器(程序计数器):控制程序指令在执行(调配指令顺序)。

类加载完后,实例对象(Java堆)、方法(Java栈)、静态变量(方法区)都已经存放在对应的内存空间,此时就需要PC寄存器(程序计数器)来控制程序指令的执行了。

执行引擎:执行指令。

五、数据类型

浅谈Java虚拟机(JVM)
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方法并执行。

相关文章:

  • 2022-01-01
  • 2021-10-23
  • 2021-04-03
  • 2021-12-20
  • 2021-08-10
  • 2021-11-02
  • 2021-08-22
猜你喜欢
  • 2021-12-11
  • 2021-07-25
  • 2022-01-31
  • 2021-06-30
  • 2021-08-10
  • 2021-08-19
相关资源
相似解决方案