【睡前读一读】JVM

JVM与JAVA体系结构

虚拟机可分为

  • 系统虚拟机:如Visual Box,VWare,是对物理计算机的仿真,提供一个可运行完整操作系统的软件平台
  • 程序虚拟机:如JAVA虚拟机,专门为执行单个计算机程序而设计,在JAVA虚拟机中执行的指令称为JAVA字节码指令

Java虚拟机

  • 作用:Java虚拟机就是二进制字节码的运行环境,负责装载字节码到内部,解释/编译为对应平台上的机器指令执行。

  • 特点

    • 一次编译,到处运行
    • 自动内存管理
    • 自动垃圾回收功能
  • 整体结构(HotSpot VM)

    1. 上层:

      class files -> 类装载器子系统

      将字节码文件加载到内存中生成class对象

    2. 中层:运行时数据区(Runtime Data Area)

      • 方法区
      • 虚拟机栈(之前称为Java栈)
      • 本地方法栈(Native Method Stack)
      • 堆(heap)
      • 程序计数器(PCR)
    3. 下层:

      1. 执行引擎

        将字节码文件解释成机器识别的机器指令执行

      2. 本地方法接口

      3. 本地方法库

Java代码执行流程

  1. Java源码(xxx.java)
  2. Java编译器
    1. 词法分析
    2. 语法分析
    3. 语法/抽象语法树
    4. 语义分析
    5. 注解抽象语法树
    6. 字节码生成器
  3. 字节码(xxx.class)
  4. Java虚拟机
    1. 类加载器
    2. 字节码校验器
    3. 翻译字节码(解释器,解析执行【保证时间??】)、JIT编译器(编译执行【编译热点代码即翻译成机器指令并放入缓存区】)
  5. 操作系统

为什么不直接将所有代码即时编译成机器指令? 如果即时编译使用过多或过高级会造成程序启动卡顿,但是如果不使用即使编译效果又不好

解释器相对于编译器响应时间快

JVM的架构模型

  • Java编译器输入的指令流一般分为两种

    • 基于栈的指令架构

      特点:

      • 设计和实现更简单(将一次方法的执行看作一个入栈操作,执行完做一个出栈的操作),适用于资源受限的系统(如小型嵌入式系统)
      • 避开了寄存器的分配难题:使用零地址指令方式分配??
      • 指令流中的指令大部分是零地址指令【采用单字节对齐】,其执行过程依赖于操作栈。指令集更小【但是指令多】编译器容易实现
      • 不需要硬件支持,可移植性更好,更好实现跨平台
    • 基于寄存器架构

      特点:

      • 典型的应用是x86的二进制指令集
      • 指令集架构完全依赖硬件,可移植性差(指令在cpu中的高速缓存区中执行)
      • 性能优秀和执行更高效
      • 花费更少的指令去完成一项操作【采用双字节对齐???】
      • 在大部分情况下,基于寄存器架构的指令集往往一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集是以零地址指令为主

JVM的生命周期

1. 虚拟机的启动

Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成,这个类是由虚拟机的具体实现指定的。

2. 虚拟机的执行

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

jps打印当前程序中的进程

3. 虚拟机的退出

  • 程序正常执行结束
  • 程序在执行过程中遇到了异常或错误而异常终止
  • 由于操作系统出现错误导致Java虚拟机终止
  • 某些线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
  • 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

JIT:即时编译器

常见的Java虚拟机

  • Sun Classic VM:第一款商用虚拟机
    • 内部只提供了解释器【执行效率低下】
    • 如果使用JIT编译器,就需要进行外挂。但是一旦使用JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作
    • hotspot内置了此虚拟机。
  • Exact VM
    • 准确式内存管理:虚拟机可以知道内存中某个位置的数据具体是什么类型【判断是地址还是对象??】
    • 具备高性能虚拟机的雏形
      • 热点探测:探测热点代码
      • 编译器与解释器混合工作模式
  • HotSpot VM ☑️
    • 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
    • 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡
  • BEA的JRockit☑️
    • 专注于服务器端应用
      • 不关注启动速度故不包含解析器,全部代码都是编译器编译后执行
    • 是世界上最快的JVM
    • 优势:全面的Java的运行时解决方案组合
      • JRockit面向延迟敏感型的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要
      • MissionControl服务套件,是一组以极低的开销来监控、管理和分析生成环境中的应用程序工具
  • IBM的J9☑️
    • 市场定位与HotSpot相似
  • Dalvik VM:
    • 没有遵循Java虚拟机规范,不能执行Java的Class文件
    • 基于寄存器架构,不是jvm的栈架构
    • 它执行编译后的dex文件,可以通过Class文件转化过来
    • Android5.0支持提前编译AOT(源码直接变成机器指令)
  • Graal VM:
    • 在HotSpot VM的基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值