JVM---概述
虚拟机
/** * 【虚拟机】 * Virtual Machine; * 虚拟的计算机; * 一款软件; * * 作用: * 执行一系列虚拟计算机指令; * 分类: * 系统虚拟机: * VMware...; * 对物理计算机的仿真,提供 一个可运行完整操作系统的软件平台; * 模拟硬件环境; * * 程序虚拟机; * JVM...; * 专门为执行单个计算机程序设计; * 硬件->OS->JVM */
概述
/** * 【JVM-概述】 * 作用: * JVM就是 二进制字节码 的运行环境; * JVM负责 load字节码到其内部,解释/编译为 对应平台上的 机器指令执行; * 特点: * 一次编译,到处运行; * 自动内存管理; * 自动垃圾回收; * * 位置: * 硬件->OS->JVM */
整体结构
/** * 【JVM-整体结构】 * 类加载器子系统 * 运行时数据区 * 执行引擎 */
架构模型
/** * 【JVM-架构模型】 * 指令集架构: * 基于栈的指令集架构; * 使用 零地址指令 分配; * 指令集更小,但同样的操作指令多; * 2+3 字节码指令: * iconst_2 * istore_1 * iconst_3 * istore_2 * iload_1 * iload_2 * iadd * istore_0 * 不需要硬件支持,移植性更好; * * 基于寄存器的指令集架构; * 性能优秀、执行高效; * 指令更少; * 2+3 寄存器指令: * mov eax,2 * add eax,3 * 指令集依赖硬件,移植性差; * */
基于栈(Stack-based)的指令集架构:
计算机处理器设计,它依赖于 内存中的数据栈 来存储和检索操作数;
在这种体系结构中,计算任务通常通过一系列对栈的操作来完成;
在基于栈的指令集中,操作数 不会直接出现在指令中,而是 由指令去访问栈顶或者栈中的特定位置来获取;
这样做的优点是可以减少指令长度,并且可以简化编译器的设计,因为编译器不需要关心具体的寄存器分配问题;
零地址指令(Zero Address Instruction):
一种机器指令;
特点:不包含操作数的地址字段。
这意味着在一条指令中,仅包含操作码(Opcode),而没有直接指定的操作数。
这并不意味着指令不需要任何操作数,而是操作数可能以某种隐含的方式提供或通过其他方式来获取 ;
在基于栈的体系结构中,操作数 通常位于内存中的数据栈上;
零地址指令 可以使用栈顶的数据作为操作数,或者执行对栈的操作,如入栈(PUSH)、出栈(POP)等;
生命周期
/** * 【JVM-生命周期】 * 启动: * 通过 引导类加载器(bootstrap class loader)创建一个初始类(init class)来完成的,这个初始类 由JVM的具体实现指定; * * 执行: * 一个运行中的JVM有着一个清晰的任务:执行程序; * 程序 开始执行时 JVM允许,程序结束 JVM结束; * 执行一个 程序时,其实执行的是 一个JVM进程; * * 退出: * 程序正常结束; * 程序执行过程中遇到异常或错误终止; * 由于OS异常导致JVM进程终止; * 某个线程调用 Runtime 或 System的exit方法; * ... */
HotSpot
/** * 【JVM-Hotspot】 * Oracle JDK 与 OpenJDK 都默认 Hotspot; */