avatar

目录
JVM笔记:JVM与Java体系结构

1 Java及字节码

1.1 Java生态圈

Java 是目前应用最为广泛的软件开发平台之一。随着Java 以及Java 社区的不断壮大,Java 也早己不再是简简单单的一门计算机语言, 它更是一个平台、一种文化、个社区。

  • 作为一个平台, Java 虚拟机扮演着举足轻重的作用。
    • Groovy 、Scala 、JRuby 、Kotlin 等都是Java 平台的一部分
  • 作为一种文化, Java 几乎成为了“ 开源” 的代名词。
    • 第三方开源软件和框架。如Tomcat 、struts, MyBatis, spring 等。
    • 就连JDK 和JVM 自身也有不少开源的实现, 如OpenJDK 、Harmony
  • 作为一个社区, Java 拥有全世界最多的技术拥护者和开源社区支持, 有数不清的论坛和资料。从桌面应用软件、嵌入式丌发到企业级应用、后台服务器、中间件,都可以看到Java 的身影。其应用形式之复杂、参与人数之众多也令人咋舌。

1.2 Java:跨平台的语言

image.png

  • 随着Java7 的正式发布, Java 虚拟机的设计者们通过JSR 一292 规范基本实现在Java 虚拟机平台上运行非Java 语言编写的程序。
  • Java 虚拟机根本不关心运行在其内部的程序到底是使用何种编程编程编写的,它只关心“ 字节码” 文件。也就是说Java 虚拟机拥有语言无关性, 并不会单纯地与Java 语言“ 终身绑定” , 只要其他编程语訁的编译结果满足并包含Java 虚拟机的内部指令集、符号表以及其他的辅助信息, 它就是一个有效的字节码文件, 就能够被虚拟机所识别并装载运行。

Java不是最强大的语言,但JVM是最强大的虚拟机。

1.3 字节码

  • 我们平时说的java 字节码, 指的是用java 语言编译成的字节码。准确的说任何能在JVM平台上执行的字节码格式都是一样的。所以应该统称为:JVM字节码。
  • 不同的编译器, 可以编译出相同的字节码文件, 字节码文件也可以在不同的JVM上运行。
  • Java 虚拟机与Java 语言并没有必然的联系, 它只与特定的二进制文件格式(Class 文件格式所关联), Class 文件中包含了Java 虚拟机指令集( 或者称为字节码、Bytecodes ) 和符号表, 还有一些其他辅助信息。

2 虚拟机与Java虚拟机

2.1 虚拟机

所谓虚拟机(virtual Machine) , 就是一台虚拟的计算机。它是一款软件, 用来执行一系列虚拟计算机指令。大体上, 虚拟机可以分为系统虚拟机和程序虚拟机。

  • 大名鼎鼎的virtual Box, VMWare就属于系统虚拟机, 它们完全是对物理计算机的仿真, 提供了一个可运行完整操作系统的软件平台。
  • 程序虚拟机的典型代表就是Java 虚拟机, 它专门为执行单个计算机程序而设计, 在Java 虚拟机中执行的指令我们称为Java 字节码指令。

无论是系统虚拟机还是程序虚拟机, 在上面运行的软件都被限制于虚拟机提供的资源中。

2.2 Java虚拟机

  • Java 虚拟机是一台执行Java 字节码的虚拟计算机, 它拥有独立的运行机制,其运行的Java 字节码也未必由Java 语言编译而成。
  • JVM平台的各种语言可以共享Java 虚拟机带来的跨平台性、优秀的垃圾回器, 以及可靠的即时编译器。
  • Java 技术的核心就是Java 虚拟机( JVM , Java Virtual Machine ) ,因为所有的Java 程序都运行在Java 虚拟机内部。
  • 作用
    • Java 虚拟机就是二进制字节码的运行环境, 负责、载字节码到其内部, 解释/编译为对应平台上的机器指令执行。每一条Java 指令, Java 虚拟机规范中都有详细定义, 如怎么取操作数, 怎么处理操作数, 处理结果放在哪里。
  • 特点
    • 一次编译, 到处运行
    • 自动内存管理
    • 自动垃圾回收功能

2.3 JVM的位置

JVM是运行在操作系统知识的,它没有和硬件直接交互。

image.png

image.png

3 JVM的整体结构

  • HotSpot VM是目前市面上高性能虚拟机的代表作之一
  • 它采用解释器与即时编译器并存的架构。
  • 在今天, Java 程序的运行性能早己脱胎换骨, 己经达到了可以和c / c + + 程序一较高下的地步。

Java虚拟机是用来解释和运行字节码文件的,所以入口原材料是Class files(字节码文件),字节码文件首先进入类装载子系统,类装载子系统将字节码文件加载到内存(加载、链接、初始化)。在运行时数据区,方法区和堆是多个线程共享的,而对于虚拟机栈、本地方法栈、和程序计数器是每个线程都有一份的。

image.png

更详细的结构图

4 Java代码执行流程


Java编译器也可以称为前端编译器,JIT编译器也称为后端编译器。

image.png

  • Java 编译器编译过程中, 任何一个节点执行失败就会造成编译失败。
  • 虽然各个平台的Java 虚拟机内部实现细节不尽相同, 但是它们共同执行的字节码内容却是一样的。
  • JVM的主要任务就是负责将字节码装载到其内部, 解释/ 编译为对应平台上的机器指令( 即: 汇编语言) 执行。
  • Java 虚拟机使类加载器(Class Loade r ) 装载Class文件。
  • 类加载完成之后, 会进行字节码校验, 字节码校验通过之后JVM 解释器会把字节码翻译成机器码( 即: 汇编语言) 交由操作系统执行。
  • 但不是所有代码都是解释执行的, JVM 对此做了优化。比如, 以Hotspot虚拟机来说, 它本身提供了JIT (Just In Time )

image.png

操作系统只能识别机器指令,高级语言翻译成机器指令主要由执行引擎来完成的。目前市面上主流的虚拟机都采用了解释执行和编译执行并行的方式,解释器是主要用来保证响应时间的,直接针对字节码进行解释执行。JIT编译器针对某些代码是要反复执行的(热点代码),可以直接把要反复执行的代码编译成机器指令,在把机器指令放在方法区缓存起来(这里就出现了两次编译,第一次编译把java代码编译成字节码文件,第二次编译报字节码编译成机器指令),所以JIT编译器主要负责程序执行的性能。

5 JVM的架构模型

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

具体来说: 这两种架构之间的区别:

  • 基于栈式架构的特点
    • 设计和实现更简单, 适用于资源受限的系统:
    • 避开了寄存器的分配难题: 使用零地址指令方式分配。
    • 指令流中的指令大部分是零地址指令, 其执行过程依赖于操作栈。指令集更小,编译器容易实现。
    • 不需要硬件支持, 可移植性更好, 更好实现跨平台
  • 基于寄存器架构的特点
    • 典型的应用是x86 的二进制指令集: 比如传统的PC以及Android的Davlik 虚拟机。
    • 指令集架构则完全依赖硬件, 可移植性差
    • 性能优秀和执行更高效;
    • 花费更少的指令去完成一项操作。
    • 在大部分情况下, 基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地且指令为主, 而基于栈式架构的指令集却是以零地址指令为主。


总结:
由于跨平台性的设计, Java 的指令都是根据栈来设计的。不同平台CPU 架构不同, 所以不能设计为基于寄存器的。优点是跨平台, 指令集小, 编译器容易实现, 缺点是性能下降, 实现同样的功能需要更多的指令。

时至今日, 尽管嵌入式平台己经不是Java 程序的主流运行平台了( 准确来说应该是HotSpotVM 的宿主环境己经不局限嵌入式平台) , 那么为什么不将架构更换为基于寄存器的架构呢?
因为基于栈的指令集:跨平台性好、指令集小,在非资源受限的平台也是可以使用的。

6 JVM的生命周期

启动、执行、退出

6.1 虚拟机的启动

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

6.2 虚拟机的执行

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

6.3 虚拟机的退出

有如下的几种情况:

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

注:本文为尚硅谷2020最新版宋红康JVM教程学习笔记

文章作者: foochane
文章链接: https://foochane.cn/article/2020061001.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 foochane
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论