官方规范与参考书目
Java Platform Standard Edition 8 Documentation
《码出高效》
《自己动手写Java虚拟机》
Java与虚拟机概述
- 【Java】Java是跨平台的语言,JVM是跨语言的平台,只要是符合规范的字节码文件就可以在JVM上运行,并不会关心原始的语言是什么,所以我们看到Scala等编译后可以在JVM上运行。
- 【Java】多语言混合编程:因为JVM的特性,使得多语言混合编程成为可能
- 【虚拟机】系统虚拟机(VMWare:对物理计算机的仿真)和程序虚拟机(java 虚拟机,专门为执行单个计算机程序而设计的,二进制字节码的运行环境),无论程序虚拟机还是系统虚拟机上面运行的程序都限制于虚拟机提供的资源当中。
- 【虚拟机】二进制字节码的运行环境,负责装载字节码到其内部,解释或编译为对应平台(windows、linux、macos)上的机器指令执行,每一条Java指令,Java虚拟机规范中都有详细的定义,如怎么取操作数、怎么处理操作数、处理结果放在哪里。
- 【虚拟机】一次编译处处运行,自动内存管理,自动垃圾回收机制
- 【虚拟机位置】
- 【Java体系】
.java ——(前端编译器:javac)——> .class ——(后端编译器)——->机器指令【JVM整体结构】(HotSpot)
类装载器:将字节码文件加载进内存
多线程共享方法区和堆。
将字节码加载到内存后使用解释器、JIT编译器解释编译。Java程序执行流程
JVM后端编译器:解释执行和编译执行并存。
解释器:保证响应时间。对字节码指令逐行进行解释执行
编译器:负责执行性能。字节码指令中部分指令反复执行(热点代码),将热点代码编译成机器指令并缓存(放在方法区),下次可以直接调用。
JVM的指令执行引擎架构模型
- ⭐基于栈的指令集架构(HotSpot的指令执行引擎架构是基于栈的)
HotSpot只有PC寄存器,每执行一个方法都需要入栈,方法执行完毕需要出栈。
- 设计和实现比较简单,适用于资源受限的系统。
- 避开了寄存器的分配难题,使用零地址指令(指令中没有内存地址,只有操作数)方式分配。
- 不需要硬件支持,可以执行更好,更好的实现跨平台
- 基于寄存器的指令集架构(比如android的davlik虚拟机)
- 指令集架构完全依赖硬件,可以执行差
- 执行效率更高
- 花费更少的指令(但是指令集更庞大)
JVM的生命周期
- 虚拟机的启动
引导类加载器(bootstrap class loader)创建一个初始类(initial class,不同的虚拟机初始类的名字不同)
- 虚拟机的执行
执行一个Java程序的时候,其实是在运行一个java虚拟机进程。
jps:打印当前系统的Java进程情况
- 虚拟机的结束
- 程序正常结束
- 程序在执行过程中遇到了异常终止
- 操作系统出现问题,导致异常终止
- 主动退出System.exit 和 Runtime.halt
Runtime就是JVM的运行时数据区的实例,是单例模式