JVM探索-7.JVM虚拟机架构

时间:2022-11-8 10:30     作者:林立     分类: 作品


Java 虚拟机是怎么运行的

  • 首先 jvm 在类中查找main方法。如果存在,它将从该处开始执行。
  • 在 Java 虚拟机内部,线程有两种形式:守护程序和非守护程序。 守护程序线程通常是虚拟机本身使用的线程,例如执行垃圾收集的线程。 但是,该应用可以将其创建的任何线程标记为守护程序线程。 应用的初始线程(从main()开始的线程)是非守护程序线程。
  • 只要任何非守护程序线程仍在运行,Java 应用就会继续执行(虚拟机实例继续运行)。 Java 应用的所有非守护程序线程都终止时,虚拟机实例将退出。 如果得到安全管理器允许,应用程序还可以通过调用Runtime或System类的exit()方法来使其自身灭亡。

Java 虚拟机架构

  • 所有的 JVM 都包含两个组成部分:
  • 1.类加载器子系统:一种用于加载给定完全限定名称的类型(类和接口)的机制。
  • 2.执行引擎:负责执行已加载类的方法中包含的指令的机制。
  • 当 Java 虚拟机运行程序时,它需要内存来存储许多内容,包括字节码、来自加载的类文件的信息、程序实例化的对象、方法的参数、返回值、局部变量和计算的中间结果。
  • 虚拟机的不同实现可能具有非常不同的内存限制。 一些实现可能需要大量内存才能工作,而其他实现可能很少。 一些实现可能能够利用虚拟内存,而其他一些则不能。 运行时数据区规范的抽象性质有助于简化在各种计算机和设备上实现 Java 虚拟机的过程。
  • 不同的 Java 程序具有不同的 jvm 实例。 如果执行一个类,则一个单独的 jvm 实例将处理该类。
  • 当虚拟机加载类文件时,它会从类文件中包含的二进制数据中解析有关类型的信息。 它将类型信息放入方法区域,将程序实例化的所有对象放入堆。
  • 每个新线程在产生时都会获得自己的 PC 寄存器(程序计数器)和 Java 堆栈。如果线程正在执行 Java 方法(不是 native 方法),则 PC 寄存器的值指示要执行的下一条指令。线程的 Java 堆栈存储线程的 Java(非本机)方法调用的状态。
  • Java 堆栈由堆栈帧(或帧)组成。堆栈帧包含一个 Java 方法调用的状态。当线程调用方法时,Java 虚拟机会将新帧推送到该线程的 Java 堆栈上。当该方法完成时,虚拟机会弹出并丢弃该方法的帧。
  • Java虚拟机实际上包含了两大类加载器:bootstrap类加载器和用户自定义类加载器。
  • PC 寄存器的大小为1个字,因此它既可以保存本机指针,也可以保存返回地址, 当线程执行 Java 方法时,PC 寄存器包含该线程正在执行的当前指令的地址。这个地址可以是本机指针,也可以是方法字节码开头的偏移量。如果线程正在执行 native 方法,则 PC 寄存器的值未定义。
  • 此处有两个堆栈:
  • 1.Java 堆栈:JVM所持有并维护。
  • 2.Native 堆栈: 看情况而定,主要依赖于外部实现能力。