JVM (Java Virtual Machine)(Java虚拟机)
为什么要学习JVM
- 面试需要
- 更深入理解JAVA语言
- 排查解决故障
- 性能调优
认识JVM
JVM是什么?
- 通过软件模拟的具有完整硬件系统功能的
- 运行在一个完全隔离环境中的计算机系统
- 通过软件模拟Java字节码的指令集,是Java程序的运行环境
可以理解为是一个软件,运行字节码指令,从而实现运行程序
JVM能做什么?
- 通过ClassLoader寻和装载Class文件(备注:Class文件本质就是字节码)。
- 解释字节码为指令并执行。
- 运行期间进行内存分配和垃圾回收
- 提供与硬件交互的平台
- 对于JVM来说,只关心*.class文件。而程序员,使用什么语言来开发,都可以,只要使用的语言可以被编译成class文件,就可以被虚拟机进行装载并运行
- java文件是通过java编译器(javac)编译成class文件的, 如果C语言有一种编译器,可以按照JVM规范将其编译成class文件,那么C语言开发的代码也是可以在JVM上运行,可惜的是现在并没有这样的一种编译器。
JVM规范
JVM指令集
- 下面这张表格是《JVM规范》中2.11中提出的部分指令集,
- 第一列的“T”代表通配符,每一行的首字母代表对应的数据类型,仔细观察很容易发现其中的规律
- 看一个简单的程序,源代码和指令集的一个映射关系,加深下印象
Class文件格式
-
基本概念,定义
- Class文件是JVM的输入,Java虚拟机规范中定义了Class文件的结构
- Class文件是JVM实现平台无关、技术无关的基础
-
L 表示对象 [ 表示数组 V表示 Void
- 对于程序员来说,面对的是JAVA文件
- 对于JVM来说,面对的是CLASS文件
- Class文件本质上就是16进制编码,由于16进制编码理解成本过大,因此有指令集和16进制编码一一对应,方便用户去理解
- 因此对于Class文件的可视问题,程序员是看指令集,JVM是看16进制编码(指令集 == 16进制编码)
- 如何去读懂这样的一个16进制字节码文件呢?那么就要依赖于《JVM规范》中4.1章节的ClassFile结构,此部分仅作了解即可,知其所以然即可。