一、初始JVM
1.1 初始JVM
JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。
机器码是由二进制编码表示的计算机指令。每个机器码通常对应一个特定的操作,如加法、乘法、跳转等。机器码是计算机能够直接执行的代码,它可以在计算机的内存中存储和执行。
计算机通过将机器码加载到CPU中执行,进行各种操作和运算。机器码是计算机的最底层指令,它由一系列的二进制位组成,每个位表示不同的含义,如操作码、寄存器地址、内存地址等。
1.2 JVM的功能
字节码需要在JVM中解释执行,相比直接翻译成机器码会有一定的性能损失,但是优点所带来的好处使得Java在跨平台开发和安全编程中得到广泛应用。
以下是Java采用字节码的优点:
-
可移植性:字节码是一种与平台无关的中间代码,它可以在任何支持Java虚拟机(JVM)的操作系统上运行。只要目标平台上有JVM,就可以将字节码加载并执行,无需修改源代码。这种可移植性使得Java成为一种跨平台的编程语言。
-
安全性:字节码在执行之前需要经过JVM的安全检查。JVM可以对字节码进行类加载、字节码验证、安全检查等操作,确保字节码不会直接对底层系统造成损害。这种安全性机制可以防止恶意代码对计算机系统造成破坏。
-
高级开发环境:Java的编译器将源代码翻译成字节码后,开发人员可以利用丰富的开发工具和环境进行调试、测试和优化。开发人员可以进行实时的代码修改和调试,提高开发效率。
-
跨语言互操作性:由于字节码是一种中间代码,它可以与其他语言的中间代码相互转换、调用和交互。这意味着可以在Java程序中使用其他语言编写的模块和库,或者将Java程序的字节码转换成其他语言的可执行形式。
1.3 常见jvm
常见的JVM有HotSpot、GraalVM、OpenJ9等,另外DragonWell龙井JDK也 提供了一款功能增强版的JVM。其中使用最广泛的是HotSpot虚拟机
二、字节码文件详解
2.1 字节码文件的组成
2.1.1 字节码文件打开方式
字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,无法直接用记事本打开阅读。
使用jclasslib插件可以打开
2.1.2 字节码文件的组成
2.1.2.1 魔数
- 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。
- 软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该种类型就会出错。
- Java字节码文件中,将文件头称为magic魔数。
2.1.2.2 主副版本号
- 主副版本号指的是编译字节码文件的JDK版本号,主版本号用来标识大版本号;副版本号是当主版本号相同时作为区分不同 版本的标识,一般只需要关心主版本号。
- 版本号的作用主要是判断当前字节码的版本和运行时的JDK是否兼容。
上述问题就是当前jdk版本为1.6,但是字节码文件为1.8.因此编译错误