一、JVM 与 Java 体系结构
1、JVM 的位置
JVM 是运行在操作系统之上的,它与硬件没有直接的交互
2、JVM 的整体结构
3、Java 代码执行流程
4、JVM 的架构模型
Java 编译器输入的指令流基本上是一种基于栈的指令集架构
,另外一种指令集架构则是基于寄存器的指令集架构
。
两者区别:
基于栈的指令集架构:
- 设计和实现更简单,适用于资源受限的系统;
- 避开了寄存器的分配难题,使用
零地址指令
方式分配; - 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译更容易实现;
- 不需要硬件支持,可移植性好,更好实现跨平台。
基于寄存器的指令集架构:
- 典型的应用就是 x86 的二进制指令集;比如传统的 PC 以及 Android 的 Davlik 虚拟机;
- 指令集架构则完全依赖硬件,可移植性差;
- 性能优秀和执行更高效;
- 花费更少的指令去完成一项操作;
- 在大部分情况下,基于寄存器架构的指令集往往都以一地指令、二地址指令和三地址指令为主。
零地址指令:
零地址指令是机器指令的一种,是指令系统中的一种不设地址字段的指令,只有操作码,没有操作数。这种指令有两种情况:一是无需操作数,另一种是操作数为默认的(隐含的),默认为操作数在寄存器中,指令可直接访问寄存器。
5、JVM 的生命周期
1、 启动:
Java 虚拟机的启动是通过引导类加载器(Bootstrap ClassLoader)创建一个初始类(initial class)来完成启动的,这个类由虚拟机的具体实现指定。
2、执行:
- 一个运行中的 Java 虚拟机有着一个明确的任务:执行 Java 程序;
- 程序开始执行时它才运行,程序结束时它就停止;
- 执行一个所谓的 Java 程序时,真正执行的是一个 Java 虚拟机的进程。
3、退出:
- 程序正常执行结束;
- 程序在执行过程中遇到了异常或错误而导致虚拟机进程非正常停止;
- 操作系统出现错误导致虚拟机进程非正常停止;
- 某线程调用 Runtime 类或 System 类的 exit() 方法,或者 Runtime 类的 halt() 方法,并且 Java 安全管理器也运行这次 exit 或 halt 的操作。