以下所有的内容都是基于Hotspot类型的JVM。

Java代码执行流程

Java代码执行流程 -1-.svg

JVM整体结构图

  • 简图

JVM - 图2

  • 说明

    • 在运行时数据区中,方法区和堆是多线程共享的;而 Jvm栈、本地方法栈、程序计数器是每个线程独有的。
      • 方法区 在jdk8中又叫做元空间Metaspace。 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,Just-In-Time Compiler)编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
    • 执行引擎用于将字节文件解释为机器语言
  • 详图
    sri.png

    架构模型

  • 栈架构模型

    • 跨平台性、指令集小、指令多;执行性能比寄存器架构模型差。
    • 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进程即会退出。——官网