1. 从三种认知角度重识JVM

1. JVM概述(一)
  • JVM:Java Virtual Machine,也就是Java虚拟机
  • 虚拟机是什么?通过软件模拟的具有完整硬件系统功能的,运行在一个完全隔离环境中的计算机系统
  • JVM是通过软件来模拟Java字节码的指令集,是Java程序的运行环境

2. JVM概述(二)

第二章:认识JVM规范 - 图1

这张图描述了Java程序是如何运行在操作系统上的

首先,Java编译器会将源代码编译成.class文件,这需要遵循JVM规范;然后,ClassLoader也就是类装载器会将.class文件装载到JVM中。在运行期,JVM要做内存分配,通过字节码执行引擎执行代码,垃圾回收等工作,如果涉及到并发处理,JVM还要做高效的并发处理工作。

3. JVM主要功能
  1. 通过ClassLoader寻找和装载class文件
  2. 解释字节码成为指令并执行,提供class文件的运行环境
  3. 进行运行期间的内存分配和垃圾回收
  4. 提供与硬件交互的平台

4. 虚拟机是Java平台无关的保障

第二章:认识JVM规范 - 图2

2. JVM规范作用及其核心

  • JVM规范的作用
    • Java虚拟机规范为不同的硬件平台提供了一种编译Java技术代码的规范
    • 该规范使Java软件独立于平台,因为编译时针对作为虚拟机的“一般机器”而做
    • 这个“一般机器”可用软件模拟并运行于各种现存的计算机系统,也可用硬件来实现
  • JVM规范定义的主要内容
    • 字节码指令集(相当于中央处理器CPU)
    • Class文件的格式
    • 数据类型和值
    • 运行时数据区
    • 栈帧
    • 特殊方法
    • 类库
    • 异常
    • 虚拟机的启动,加载,链接和初始化

3. 理解JVM规范中的虚拟机结构

  • 字节码指令集(相当于中央处理器CPU)
  • Class文件的格式
  • 数据类型和值
  • 运行时数据区
  • 栈帧
  • 特殊方法
    • <init>:实例初始化方法,通过JVM的invokespecial指令来调用
    • <clint>:类或接口的初始化方法,不包含参数,返回void
  • 类库
    • Java虚拟机必须要对一些Java类库提供支持,否则这些类库根本无法实现,比如下面这些:
      • 反射
      • 加载和创建类或接口,如ClassLoader
      • 连接和初始化和接口的类
      • 安全,如security
      • 多线程
      • 弱引用
  • 异常
  • 虚拟机的启动,加载,链接和初始化

4. Class字节码解析:理解ClassFile结构

概览:

  1. Class文件格式
  2. 阅读class字节码文件
  3. 阅读“虚拟机汇编语言“表示的Java类

Class文件格式概述

  • Class文件是JVM的输入,Java虚拟机规范中定义了Class文件的结构。Class文件是JVM实现平台无关,技术无关的基础
  • Class文件是一组以8字节为单位的字节流,各个数据项目按序紧凑排列
  • 对于占用空间大于8字节的数据项,按照高位在前的方式分割成多个8字节进行存储
  • Class文件格式里只有两种类型:无符号数,表
    • 无符号数:基本数据类型,以u1,u2,u4,u8来代表几个字节的无符号数
    • 表:由多个无符号数和其他表构成的复合数据类型,通常以”_info”结尾

Class文件格式:

  • javap工具生成非正式的“虚拟机汇编语言”格式如下:
    <index><opcode>[<operand1>[<operand2>...]][<comment>]
  • <index>是指令操作码在数组中的下标,该数组以字节形式来存储当前方法的Java虚拟机代码;也可以是相对于方法起始处的字节偏移量
  • <opcode>是指令的助记码,<oprand>是操作数,<comment>是行尾的注释