虚拟机与 JVM
虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列的虚拟计算机指令。
虚拟机可以分为系统虚拟机和程序虚拟机:
- Visual Box、VMware 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可与逆行的完整操作系统的软件平台。
- 程序虚拟机的经典代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。
- 在虚拟机上运行的软件都被限制于虚拟机提供的资源中。
上面把JVM叫做Java虚拟机其实并不是特别合适,因为现如今不只有Java可以使用JVM,如Kotlin、Groovy这些,都可以编译为字节码文件(所有语言编译后的JVM字节码文件均遵循JVM规范),在JVM上运行。
这也是Java为什么是跨平台语言的原因,因为字节码是统一的
JVM
JVM 的作用
Java虚拟机就是二进制字节码的运行环境,负责装在字节码到其内部,解释/编译为对应平台的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义,如:怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点:
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
JVM 的位置
JVM 的整体结构
- HotSpot VM 是目前市面上的高性能虚拟机代表作之一,下图为 HotSpot VM 的内存结构
- 它采用解释器与即时编译器并存的架构
Java 代码执行流程
执行流程就是我们上面简单提到过的
- Java 编译器编译 Java 源码,生成字节码文件
- 字节码文件载入 JVM
- JVM 将字节码编译为 机器码执行
JVM 指令集架构
为满足跨平台性的设计,Java 的指令集都是根据栈来设计的。
不同平台的 CPU 架构不同,所以不能设计为基于寄存器的。这样做的优点是:跨平台,指令集小,编译器容易实现,也带来了缺点:性能下降,实现同样的功能需要更多的指令
JVM 生命周期
虚拟机的启动
Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是有虚拟机的具体实现指定的。
虚拟机的执行
-
一个与运行中的 Java 虚拟机有着一个清晰的任务:执行 Java 程序。
-
程序开始执行时他才运行,程序结束时他就停止。
-
执行一个所谓的 Java 程序的时候,真真正正在执行的是一个叫做 Java 虚拟机的进程。
虚拟机的退出
有如下几种情况:
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 操作系统出现错误导致 Java 虚拟机进程终止
- 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
- 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API 来加载或卸载 Java 虚拟机时,Java 虚拟机的退出情况