初始jvm

jvm的整体结构

请添加图片描述

  1. 外部的class文件被Class Loader加载到内存中,生成一个class对象实例,这其中会涉及到加载,链接,初始化等等。
  2. 方法区和堆在内存中被多个线程共享,java栈,本地方法栈以及程序计数器是每个线程独享一份的。
  3. 执行引擎分为解释器,即时编译器,垃圾回收器等,class文件被加载到内存中,就会被执行引擎解释运行。因为我们的java程序编译后变为字节码指令进入内存,但是我们的操作系统是不识别字节码指令的,所以执行引擎就可以将字节码指令转换为操作系统可识别执行的机器指令。

java代码的执行流程

请添加图片描述

  1. java源文件经过java编译器(前端编译器)生成class文件(字节码文件),在java编译器经过语法分析,语义分析等等。在编译过程失败后都不能生成字节码文件。
  2. 字节码文件经过类加载,字节码校验,以及执行引擎(解释执行和编译执行并存执行)的转换为机器指令给操作系统进行运行。

jvm的架构模型

请添加图片描述

编写一段代码来查看他的字节码文件

public class StackStrutTest {
    
    
    public static void main(String[] args) {
    
    
        int i =2;
        int j = 3;
        int k = i+j;
    }
}

执行之后在idea控制台输入命令

javap -v StackStrutTest.class

就能查看到对应的字节码文件
请添加图片描述

  1. iconst_2表示常量2
  2. istore_1表示常量2存放在操作数栈的一个索引位置,索引值为1
  3. iconst_3表示常量3
  4. istore_2表示常量3存放在操作数栈的一个索引位置,索引值为2
  5. iload_1和iload_2表示将加载操作数栈的索引位置的值
  6. iadd表示进行+操作
  7. istore_3表示将结果保存在操作数栈索引为3的位置中
  8. return表示将结果返回

从这里就可以看出java的虚拟机HotSpot是基于栈的指令集架构,因为基于栈的指令集架构,java实现了跨平台性,在性能低的设备上也可以运行,其指令集小,指令多,但是执行性能比寄存器架构差

jvm的生命周期

1:jvm虚拟机的启动

java虚拟机的启动时通过引导类加载器(bootstrap class loader)创建的一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

2:虚拟机的执行

  1. 一个执行中的java虚拟机有着一个清晰的任务:执行java程序。
  2. 程序开始执行时,虚拟机才运行,程序结束后,虚拟机才结束。
  3. 执行一个java程序的时候,才会执行一个叫做java虚拟机的进程。

3:虚拟机的退出

  1. 程序正常执行结束
  2. 程序在执行过程中遇到了异常,错误,而异常终止
  3. 由于操作系统出现错误导致java虚拟机进程终止
  4. 某线程调用Runtime类或者System类的exit方法,或者Runtime类的halt方法,并且java安全管理器也允许这次exit或halt的操作。
  5. 除此之外,JNI(java Native Interface)规范描述了JNI Invocation API来加载或卸载java虚拟机

猜你喜欢

转载自blog.csdn.net/weixin_45690465/article/details/121909454
JVM