1.JVM 架构模型
目录
1.1.JVM 整体结构
对于JAVA虚拟机来的运行原理来说,首先需要知道JAVA虚拟机的架构模型,全文使用Orcale的hotspot 虚拟机进行对应说明,首先我们先看下对应的整体虚拟机的架构模型架构:
由上可以看出JAVA虚拟机有以下几部分组成:
- 类加载子系统
- 运行时数据区
- 执行引擎
- 本地方法接口与本地方法库
1.2.JVM的架构模型
Java编译器输入的指令流程基本上是一种基于栈的指令集架构,另外一种是基于寄存器的指令集架构。具体来说这两种架构之间区别:
基于栈的指令集架构
基于栈式架构的特点:
- 设计和实现更加简单,适用于资源受限的系统
- 避开了寄存器分配的难题:使用零地址方式分配
- 指令流中指令大部分是零地址指令,执行过程依赖栈。指令集更小,编译器更容易实现
- 不需要硬件支持,可移植性更好,更容易进行跨平台
基于寄存器的指令集架构
基于寄存器架构的特点:
- 二进制指令集,传统的PC与安卓虚拟机
- 对于硬件依赖,与硬件耦合度高,可移植性差
- 更高效的执行与更优秀的性能
- 花费更少的指令完成一个动作
- 大部分场景下基于寄存器的指令集都是一地址指令、二地址指令和三地址指令为主,与栈式指令集架构不同,栈式指令集都是零地址为主
架构举例
比如执行 2+2这个动作,指令集如下:
- 基于栈式指令集架构的计算指令(JVM为例)
iconst_2 // 常量 2 入栈
istore_1
iconst_2 // 常量 2 入栈
istore_2
iload_1
iload_2
iadd // 相加 2+2
istore_0 // 结果入栈
- 基于寄存器指令集架构的计算指令
mov eax,2
add eax,2
基于以上例子发现,基于寄存器的指令集架构使用的指令更少,基于栈式的指令集架构所需要的操作更多。
JVM架构总结
- 由于跨平台特性的设计,Java指令集都是根据栈来设计的。不同的CPU平台架构不同,所以不能基于寄存器设计。栈的优点:跨平台,指令集小,编译器容易实现。缺点:性能比寄存器差。
- 时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpot VM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?因为基于栈的指令集架构跨平台性更好、指令集小(相对于基于寄存器架构来说),跨平台性更好。
1.3 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虚拟机的退出情况。