以下所有的内容都是基于Hotspot类型的JVM。
Java代码执行流程
JVM整体结构图
- 简图
说明
- 在运行时数据区中,方法区和堆是多线程共享的;而 Jvm栈、本地方法栈、程序计数器是每个线程独有的。
- 方法区 在jdk8中又叫做元空间Metaspace。 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,Just-In-Time Compiler)编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
- 执行引擎用于将字节文件解释为机器语言
- 在运行时数据区中,方法区和堆是多线程共享的;而 Jvm栈、本地方法栈、程序计数器是每个线程独有的。
-
架构模型
栈架构模型
- 跨平台性、指令集小、指令多;执行性能比寄存器架构模型差。
- jvm基于该模型,因为不同平台CPU架构不同,考虑到JVM的跨平台特性,所以不能设计为基于寄存器的。
- 寄存器架构模型
- 指令少、性能强;和CPU高度耦合,跨平台性比栈架构模型差。
JVM分类
- SUN Classic
- Exact VM
- HotSpot VM :官方JDK默认虚拟机,HotSpot指热点代码探测技术
- BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一
- IBM J9
- Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;
- Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品
Android虚拟机DVM:
- 谷歌开发,基于Android,在2.2中提供了JIT;
- 只能称作虚拟机 不能称为java虚拟机,他没有遵循Java虚拟机规范;
- 基于寄存器架构,效率高,但是跟硬件耦合度比较高;
- 不能直接执行class文件,执行的是dex文件;
- 5.0使用支持提前编译的ART VM替换Dalvik VM
JVM退出时机:
The Java Virtual Machine exits when the only threads running are all daemon threads. 当JVM中不存在任何一个正在运行的非守护线程时,则JVM进程即会退出。——官网