JVM与JAVA体系结构
虚拟机可分为
- 系统虚拟机:如Visual Box,VWare,是对物理计算机的仿真,提供一个可运行完整操作系统的软件平台
- 程序虚拟机:如JAVA虚拟机,专门为执行单个计算机程序而设计,在JAVA虚拟机中执行的指令称为JAVA字节码指令。
Java虚拟机
-
作用:Java虚拟机就是二进制字节码的运行环境,负责装载字节码到内部,解释/编译为对应平台上的机器指令执行。
-
特点
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
-
整体结构(HotSpot VM)
-
上层:
class files -> 类装载器子系统
将字节码文件加载到内存中生成class对象
-
中层:运行时数据区(Runtime Data Area)
- 方法区
- 虚拟机栈(之前称为Java栈)
- 本地方法栈(Native Method Stack)
- 堆(heap)
- 程序计数器(PCR)
-
下层:
-
执行引擎
将字节码文件解释成机器识别的机器指令执行
-
本地方法接口
-
本地方法库
-
-
Java代码执行流程
- Java源码(xxx.java)
- Java编译器
- 词法分析
- 语法分析
- 语法/抽象语法树
- 语义分析
- 注解抽象语法树
- 字节码生成器
- 字节码(xxx.class)
- Java虚拟机
- 类加载器
- 字节码校验器
- 翻译字节码(解释器,解析执行【保证时间??】)、JIT编译器(编译执行【编译热点代码即翻译成机器指令并放入缓存区】)
- 操作系统
为什么不直接将所有代码即时编译成机器指令? 如果即时编译使用过多或过高级会造成程序启动卡顿,但是如果不使用即使编译效果又不好
解释器相对于编译器响应时间快
JVM的架构模型
-
Java编译器输入的指令流一般分为两种
-
基于栈的指令架构
特点:
- 设计和实现更简单(将一次方法的执行看作一个入栈操作,执行完做一个出栈的操作),适用于资源受限的系统(如小型嵌入式系统)
- 避开了寄存器的分配难题:使用零地址指令方式分配??
- 指令流中的指令大部分是零地址指令【采用单字节对齐】,其执行过程依赖于操作栈。指令集更小【但是指令多】编译器容易实现
- 不需要硬件支持,可移植性更好,更好实现跨平台
-
基于寄存器架构
特点:
- 典型的应用是x86的二进制指令集
- 指令集架构完全依赖硬件,可移植性差(指令在cpu中的高速缓存区中执行)
- 性能优秀和执行更高效
- 花费更少的指令去完成一项操作【采用双字节对齐???】
- 在大部分情况下,基于寄存器架构的指令集往往一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集是以零地址指令为主
-
JVM的生命周期
1. 虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成,这个类是由虚拟机的具体实现指定的。
2. 虚拟机的执行
- 一个运行中的Java虚拟机有一个清晰的任务:执行Java程序
- 程序开始执行时他才运行,程序结束便结束
- 执行一个所谓的Java程序的时候,真正在执行的是一个叫Java虚拟机的进程
jps打印当前程序中的进程
3. 虚拟机的退出
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统出现错误导致Java虚拟机终止
- 某些线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
- 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况
JIT:即时编译器
常见的Java虚拟机
- Sun Classic VM:第一款商用虚拟机
- 内部只提供了解释器【执行效率低下】
- 如果使用JIT编译器,就需要进行外挂。但是一旦使用JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作
- hotspot内置了此虚拟机。
- Exact VM
- 准确式内存管理:虚拟机可以知道内存中某个位置的数据具体是什么类型【判断是地址还是对象??】
- 具备高性能虚拟机的雏形
- 热点探测:探测热点代码
- 编译器与解释器混合工作模式
- HotSpot VM ☑️
- 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
- 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡
- BEA的JRockit☑️
- 专注于服务器端应用
- 不关注启动速度故不包含解析器,全部代码都是编译器编译后执行
- 是世界上最快的JVM
- 优势:全面的Java的运行时解决方案组合
- JRockit面向延迟敏感型的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要
- MissionControl服务套件,是一组以极低的开销来监控、管理和分析生成环境中的应用程序工具
- 专注于服务器端应用
- IBM的J9☑️
- 市场定位与HotSpot相似
- Dalvik VM:
- 没有遵循Java虚拟机规范,不能执行Java的Class文件
- 基于寄存器架构,不是jvm的栈架构
- 它执行编译后的dex文件,可以通过Class文件转化过来
- Android5.0支持提前编译AOT(源码直接变成机器指令)
- Graal VM:
- 在HotSpot VM的基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台