JVM

字节码

准确的说 任何能在JVM平台上执行的字节码格式都是一样的 所以应该统称为jvm字节码

虚拟机

所谓虚拟机 就是一台虚拟的计算机 是一款软件 用来执行一系列虚拟机计算机指令 大体上可分为

系统虚拟机程序虚拟机

Java虚拟机

是一台执行 java字节码的虚拟计算机 java技术的核心就是java虚拟机

HotSpot JRocket J9 三大虚拟机

Java虚拟机就是二进制字节码的运行环境

特点:

  • 一次编译 到处运行
  • 自动内存管理
  • 自动垃圾回收机制

jvm是运行在操作系统之上的 它与硬件没有直接的交互

JVM的整体结构

img

HotSpot VM是目前市面上高性能虚拟机的代表作之一

它采用 解释器即时编译器 并存的架构

方法区 多线程共享

栈 本地方法栈 程序计数器 每个线程独享一份

执行引擎 (3部分) : 解释器(JIT编译器 ) 即时编译器 垃圾回收器

负责 将高级语言 翻译成 机器语言

jvm

第一次编译成字节码文件 第二次在JIT编译成机器指令

JVM的架构模型

Java编译器输入的指令流基本上是一种基于栈的指令集架构 另外一种指令集架构是基于寄存器的指令集架构

基于栈特点(跨平台性 指令集小 指令多 执行性能较差)

  • 设计和实现简单 适用于资源受限的系统
  • 避开了 寄存器的分配难题 使用零地址指令方式分配
  • 指令流中的指令大部分是零地址指令 其执行过程依赖于操作栈 指令集更小 编译器容易实现
  • 不需要硬件支持 可移植性更好 更好实现跨平台

基于寄存器

  • 典型的应用是x86的二进制 指令集 传统的pc和Android的 daclik
  • 指令集架构则完全依赖硬件 可移植性差
  • 性能优秀执行高效
  • 花费更少的指令 去完成一项操作
  • 在大部分情况下 基于寄存器架构的指令集 都 以 一地址指令 二地址指令 三地址指令 而基于栈式结构的指令集为零地址指令为主

举例: 同样执行2+3这种逻辑操作

image-20200616095017354

反编译指令 javap -v 字节码文件名

jps: 查询执行中的进程

JVM的生命周期

虚拟机的启动

java虚拟机的启动是通过引导类加载器创建一个初始类来完成的 这个类 是由虚拟机具体实现指定的

(就像你想吃苹果 却发现连苹果树都没有)

虚拟机的执行

  • 一个运行中的java虚拟机有一个清晰的任务 :执行java程序
  • 程序开始执行时候他才运行 程序结束时 他就停止
  • 执行一个所谓的java程序的时候 真真正正在执行的是一个叫java虚拟机的进程

虚拟机退出

  • 程序正常执行结束
  • 程序在执行过程遇到了异常或者错误
  • 由于操作系统出现错误 虚拟机进程终止
  • 某线程调用 runtime类或者system类的exit方法 或者runtime类的halt方法 并且java安全管理器也允许这次操作
  • 除此 JNI规范描述了用JNI Invocation API(本地方法接口)来加载或卸载虚拟机的退出情况

JVM发展进程

sun Classic VM

第一个商用的java虚拟机 jdk1.4淘汰

  • 虚拟机内部只提供了 解释器(程序运行 只使用JIT或者解释器 其中之一就可以 只使用解释器 执行效率是比较低下的)
  • **JIT编译器(**热点代码 即时编译成本地机器指令 存起来 缓存) 需要外挂 但是一旦使用 JIT就会接管 解释器就不再工作

解释器类似于步行

JIT类似于公交车

应该搭配使用

Exact VM

jdk1.2 提供

  • 准确式内存管理 Exact Memory Management
  • 虚拟机可以知道内存中某个位置的数据具体是什么类型的
  • 具备现代高性能虚拟机的雏形
    • 热点探测
    • 编译器和解释器 混合工作模式
  • 只在solaris平台短暂使用 终被hotSpot替代

HotSpot VM

  • 最初 由一家名为”Longview Technologies”的小公司设计

    • 97年 sun收购 ;09年 sun公司被甲骨文收购
    • 1.3时候 HotSpot Vm成为默认虚拟机
  • 其他两个虚拟机都没有方法区的概念

  • 从服务器 桌面到移动端 嵌入式都有应用

  • 热点探测技术

    • 通过计数器找到最具编译价值代码 触发即时编译或栈上替换

    • 解释器编译器协同操作 在最优化程序响应时间和最佳执行性能中取得平衡

      解释器主要负责响应时间 编译器负责执行性能

JRocket BEA公司

  • 专注于服务器端
    • 不太关注 程序启动速度 不包含解析器实现 全部代码 都靠即时编译器执行
  • 大量行业数据显示 JRocket JVM是世界上最快的JVM
  • 全面的java运行时解决方案
  • 08年被oracle收购

IBM J9

  • 市场定位和Hotspot接近
  • 多端多用途

KVM和CDC/CLDC HotSpot

  • javaMe 产品线上的两款虚拟机 CDC/CLDC HotSpot和 Implement VM
  • KVM是 CLDC-HI早期
  • 目前移动领域地位 尴尬 智能手机被 Android和iOS二分天下
  • KVM简单 轻量 高度可移植 更低端设备 智能控制器 传感器 老人机 经济欠发达地区

Azul VM

Liquid VM

Apache Harmony

Microsoft JVM

Taobao JVM