目录
1. JVM 概述
如果把核心类库的 API 比作数学公式,那么 Java 虚拟机的知识就好比公式的推导过程 ;
了解 JVM 是一个程序员的内功。
好比张无忌可以速通乾坤大挪移,直达第九层
而苦练此武功数十年的副使杨逍也仅仅是第二层
最重要的原因之一在于张无忌内功深厚
1.1 认识 1
Java语言:一次编译,到处运行
但需要运行的计算机安装 JVM(JDK 包含 JVM);
1.2 认识 2
Java 虚拟机不关心运行在内部的程序是何种语言编写的
只关心字节码文件是否符合 Java 虚拟机的标准
只要不同的语言使用编译器生成的字节码文件符合Java 虚拟机的标准
Java 虚拟机都可以运行,
因此,Java 虚拟机 并不是只针对 Java 语言的
同时,该字节码文件可称为 jvm 字节码文件
1.3 认识 3
Java 不是最强大的语言
但 JVM 是最强大的虚拟机
1.4 认识 4
Java 平台上的多语言混合编程是主流趋势
各种语言都运行在一个虚拟机上,
且编译的字节码文件都符合 JVM 虚拟机的标准
所以,各种语言的交互不存在任何困难;
2. JVM 结构
2.1 HotSpot
Java虚拟机(JVM) 是一种标准的虚拟机规范,用于运行 Java 类文件。JVM 的主要作用是提供一个运行时环境,使 Java 程序能够在不同的硬件和操作系统上运行1。
HotSpot 是 JVM 的一种具体实现,由 Sun 公司开发,现归属于 Oracle 公司。HotSpot 虚拟机是目前使用最广泛的 JVM 实现之一;
2.2 运行流程
下图,从上往下看:
字节码文件作为“原材料”
经类加载器/装载器 将字节码文件加载到内存当中
在内存中的方法区生成大的 class 实例
之后解释器解释运行
2.3 补充
操作系统只识别机器指令,字节码要在 JVM 解释器使用 JIT 编译器编译成机器代码。
【机器指令是计算机处理器(CPU)能够直接识别和执行的命令,其本质是一系列的二进制编码。】
多个线程共用方法区和堆,而每个线程都有唯一的 Java 栈,本地方法栈,程序计数器
执行引擎包含三部分:解释器,JIT 即时编译器(编译器的后端),垃圾回收器(实现垃圾的回收)
3. 架构模型
Java 编译器输入的指令流有两种指令集架构
一种是基于栈的,另一种是基于寄存器的
3.1 基于栈式架构
1. 设计和实现更简单,适用于资源受限的系统
2. 避开了寄存器的分配难题:使用零地址指令方式分配
3. 指令流中的地址大部分是零地址指令,其执行过程依赖于操作栈。
指令集更小,编译器容易实现。
4. 不需要硬件支持,可移植性更好,更好实现跨平台
3.2 基于寄存器架构
1. 典型的应用是 x86 的二进制值指令集
2. 指令集架构完全依赖硬件,可移植性差
3. 性能优秀,执行更高效
4. 花费更少的指令完成一项操作
5. 大部分情况下,基于寄存器架构的指令集往往都以 一/二/三地址指令为主
而基于栈式架构的指令集以零地址指令为主
3.3 总结
由于跨平台性的设计
Java 的指令都是根据栈来设计的
(不同平台 CPU 架构不同,即不能设计为基于寄存器的)
所以:
跨平台性,指令集小,指令多,执行性能比寄存器差
4. JVM 的生命周期
4.1 虚拟机的启动
Java 虚拟机的启动通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)完成的
该类由虚拟机具体指定
4.2 虚拟机的执行
程序执行时 Java 虚拟机才运行
程序结束时 Java 虚拟机就停止
4.3 虚拟机的退出
程序正常执行结束
程序在执行过程中遇到异常或错误而异常终止
操作系统出现错误而导致 Java 虚拟机进程终止
某线程调用 Runtime 类 或 System 类的 exit 方法,或 Runtime 类的 halt 方法,
并且 Java 安全管理器也允许这次 exit / halt 操作