You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
21 lines
1.2 KiB
21 lines
1.2 KiB
5 years ago
|
---
|
||
|
字节码概述
|
||
|
---
|
||
|
|
||
|
### 概述
|
||
|
|
||
|
Java 虚拟机的指令由一个字节长度的操作码(opcode)和紧随其后的可选的操作数(operand)构成。“字节码”这个名字的由来也是因为操作码的长度用一个字节表示。
|
||
|
|
||
|
```
|
||
|
<opcode> [<cperand1>,<operand2>]
|
||
|
```
|
||
|
|
||
|
比如将整形常量 100 压栈到栈顶的指令是 bipush 100,其中 bipush 就是操作码,100 就是操作数。
|
||
|
|
||
|
因为操作码长度只有一个字节长度,这使得编译后的字节码文件非常小巧紧凑,但同时也直接限制了整个 JVM 操作码指令集的数量最多只能有 256 个,目前已经使用了 200+。
|
||
|
|
||
|
大部分字节码指令都包含了所要操作的类型信息。比如 ireturn 用户返回一个 int 类型的数据,dreturn 用户返回一个 double 类型的数据,freturen 指令用户返回一个 float 类型的数据,这种方式也使得字节码实际的指令类型远小于 200 个。
|
||
|
|
||
|
字节码使用大端序表示,即高位在前,低位在后的方式。
|
||
|
|
||
|
字节码并不是某种虚拟 CPU 的机器码,而是一种介于源码和机器码中间的一种抽象表示方法,不过字节码通过 JIT 技术可以被进一步编译成机器码。
|