1.1 📚 概述

📖 定义

Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/便于为对应平台上的机器指令执行。

🌠 特点

  • 一次编译,到处运行
  • 自动内存管理
  • 垃圾自动回收
graph TD A[Java程序] B[字节码文件] C[Win版JVM] D[Linux版JVM] E[Ma版JVM] A --> B B --> C B --> D B --> E

🕵️ Java代码的执行流程


🔰 拓展

Java虚拟机不仅仅能用来解释Java语言。

JVM根本不关心运行在其内部的程序到底是何种语言编写的,它只关心“字节码”文件。

即JVM具有语言无关性,并不会单纯地与Java语言终身绑定,只要其他编程语言的编译结果满足并包含JVM的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,能够被JVM所识别、装载并运行。

Java并不是最强大的语言,但JVM是最强大的虚拟机。

graph TD A1((Kotlin)) B1((Clojure)) C1((Groovy)) D1((Scala)) E1((Jython)) F1((JRuby)) G1((JavaScript)) A2[编译器] B2[编译器] C2[编译器] D2[编译器] E2[编译器] F2[编译器] G2[编译器] H[字节码文件] I[Java虚拟机] A1 --> A2 B1 --> B2 C1 --> C2 D1 --> D2 E1 --> E2 F1 --> F2 G1 --> G2 A2 --> H B2 --> H C2 --> H D2 --> H E2 --> H F2 --> H G2 --> H H --> I

1.2 📂 结构

📘 说明

  • HotSpot VM是目前市面上高性能虚拟机的代表作之一
  • 它采用解释器与即时编译器并存的架构

📷 JVM架构图


1.3 ⏳ 生命周期

🎏 虚拟机的启动

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

🎏 虚拟机的执行

  • 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序
  • 程序开始执行时他才运行,程序结束时他就停止
  • 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程

🎏 虚拟机的退出

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