第一章、JVM和Java体系架构
JVM整体结构
- 方法区和堆是线程共享的
- Java栈、本地方法栈、程序计数器是线程独享的
- 执行引擎包含解释器、即时编译器、垃圾回收器
Java代码执行流程
JVM架构模型
Java编译器输入的指令流是基于栈的指令集架构
- 基于栈的指令集架构
- 实现简单
- 不依赖于硬件,可移植性强
- 使用零地址指令分配方式,就是指令中没有操作数地址字段
- 指令简单,同样的功能使用的指令更多
- 基于寄存器的指令集架构
- 性能更好
- 依赖于硬件
- 指令复杂,同样的功能使用的指令更少
- 以一地址指令、二地址指令、三地址指令为主
两种架构的举例
同样执行2 3这种逻辑操作,其指令分别如下:
基于栈的计算流程
代码语言:javascript复制iconst_2 //常量2入栈
istore_1
iconst_3 // 常量3入栈
istore_2
iload_1
iload_2
iadd //常量2/3出栈,执行相加
istore_0 // 结果5入栈
基于寄存器的计算流程
代码语言:javascript复制mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3
JVM生命周期
- 虚拟机的启动
- 通过引导内加载器创建一个初始类,由虚拟机具体实现来指定。初始类再去调用main方法。
- 加载子类时需要先加载父类
- 虚拟机的执行
- 运行java程序,实际上是运行JVM的一个进程
- java程序运行时,jvm运行,Java程序结束时,jvm结束
- 虚拟机的退出
- Java程序退出,包含正常退出,异常、错误终止了程序
- 操作系统错误
- 程序里调用
java.lang.System#exit
,最终调用了native方法
其他JVM
Classic
世界上第一款虚拟机,只使用了解释器,性能不高
JRocket
最快的JVM,因为只使用了JIT,性能好。但是启动慢,需要编译所有字节码为本地机器指令。不过它专注于服务端,启动慢也就无所谓了。