05_指令集和解释器

指令集和解释器

Java虚拟机顾名思义,就是一台虚拟的机器,而字节码(bytecode)就是运行在这台虚拟机器上的机器码。

一、字节码指令

1.1 指令结构

字节码中存放编码后的 Java 虚拟机指令:

  • 每条指令都以一个单字节的操作码(opcode)开头。

  • 由于只使用一字节表示操作码,Java 虚拟机最多只能支持 256 条指令。

到第八版为止,Java 虚拟机规范已经定义了205条指令,操作码分别是0(0x00)202(0xCA)254(0xFE)255(0xFF)

 04_运行时数据区

运行时数据区

一、数据结构

在运行Java程序时,Java虚拟机需要使用内存来存放各式各样的数据。Java虚拟机规范把这些内存区域叫作运行时数据区。

运行时数据区可以分为两类:一类是多线程共享的,另一类则是线程私有的。

  • 多线程共享的运行时数据区需要在Java虚拟机启动时创建好,在Java虚拟机退出时销毁
  • 线程私有的运行时数据区则在创建线程时才创建,线程退出时销毁

 03_解析class文件

解析class文件

Java 虚拟机规范中所指的 class 文件,并非特指位于磁盘中的 .class 文件,而是泛指任何格式符合规范的 class 数据。它实际上可以通过网络下载,从数据库加载,甚至是在运行中直接生成等方式来获取 class 文件。

  • 构成 class 文件的基本数据单位是字节,可以把整个 class 文件当成一个字节流来处理
  • 数据由连续多个字节构成,这些数据在 class 文件中以大端(big-endian)方式存储

为了描述 class 文件格式,Java 虚拟机规范定义了 u1、u2 和 u4 三种数据类型来表示1、2和4字节无符号整数。

 02_查找class文件

查找class文件

加载允许一个类,必须把它相关的依赖类也加载进来,比如父类、成员类等。

Java虚拟机规范并没有规定去哪里寻找类,所以不同虚拟机可以采用不同的方法。

一、类加载路径

Oracle的Java虚拟机是根据类路径(classpath)来搜索类,按照搜索顺序可分为3类:

  1. 启动类路径(bootstrasp classpath):默认目录是 jre\lib,即Java标准库(大部分在rt.jar里)所在位置
  2. 扩展类路径(extension classpath):默认目录是 jre\lib\ext,即Java扩展机制的类所在位置
  3. 用户类路径(user classpath):默认当前目录,即自己实现的类、以及第三方类库所在位置

 01_命令行工具

命令行工具

Java虚拟机启动时,需要指定类启动应用程序。

但是Java虚拟机规范中并没有明确规定,怎么指定类启动应用程序,也就是主类(包含main方法的类)。

Oracle的虚拟机实现是通过 java 命令来启动的,主类名由命令函参数指定。

1
2
3
4
java [-options] class [args]
java [-options] -jar jarfile [args]
javaw [-options] class [args]
javaw [-options] -jar jarfile [args]