深入浅出 JVM 系列(一)什么是 JVM?它处于什么位置? (3)

Java 字节码是沟通 JVM 和 Java 程序的桥梁,下面使用 javap 来看一下字节码到底长什么样子。javap基本使用

javap -verbose HelloXiaoli.class
0 getstatic #2 <java/lang/System.out>
3 ldc #3 <Hello Xiaoli>
5 invokevirtual #4 <java/io/PrintStream.println>
8 return

Java 虚拟机采用基于栈的架构(为什么基于栈的架构详见:),其指令由操作码和操作数组成。这些字节码指令,就叫做 opcode。其中,getstatic、ldc、invokeevirtual、return 等,就是 opcode。

我们继续使用 hexdump 看一下字节码的二进制内容hexdump 命令

b2 00 02 12 03 b6 00 04 b1

我们可以看一下它们的对应关系。JVM 字节码对照表

0xb2   getstatic       获取静态字段的值
0x12   ldc             常量池中的常量值入栈
0xb6   invokevirtual   运行时方法绑定调用方法
0xb1   return          void 函数返回

opcode 是一个字节的长度(0~255),意味着指令集的操作码个数不能超过 256 条。紧跟在 opcode 后面的是被操作数。比如 b2 00 02,就代表了 getstatic #2 。

JVM 就是靠解析这些 opcode 和 操作数来完成程序的执行的,当我们使用 Java 命令运行 .class 文件的时候,实际上就相当于启动了一个 JVM 进程。

JVM 会翻译这些字节码,它有两种执行方式:

解释执行,将 opcode + 操作数翻译成机器代码;

JIT,即时编译,它会在一定条件下将字节码翻译成机器码之后再执行。

即时编译器与解释器的区别?

.class 文件会被加载、存放到 metaspace 中,等待被调用,这里会有一个类加载器的概念。

JVM 的程序运行,都是在栈上完成的,这和其他普通程序的执行是类似的,分为堆和栈。比如我们程序运行到了 main 方法,就会给它分配一个栈帧。当推出方法体时,会弹出相应的栈帧。其实,大多数字节码指令,就是不断的对栈帧进行操作。

而其它大块数据,是存放在堆上的。Java 在内存划分上会更为细致,关于这些概念,会在后面的章节中详细介绍。

我们看下面的图,JVM 部分是我们系列需要讲解的部分。

img

小结

上面讲了这么多,让我们再回头看看面试官提问的三个问题。

为什么 Java 研发系统需要 JVM?

因为 Java 是一门抽象的语言,并且有自动内存管理机制。而操作系统无法去进行自动垃圾回收等操作,所以就有了虚拟机。虚拟机可以对字节码加载、自动垃圾回收、并发等。而 JVM 只是一个规范,定义了 .class 文件的结构、加载机制、数据存储、运行时栈等诸多内容,最常用的 JVM 实现就是 Hotspot。

你对 JVM 的运行原理了解多少?

JVM 的生命周期是和 Java 程序的运行一样,当程序运行结束,JVM 实例也就跟着消失了。具体的运行原理,会在后续文章中详细介绍,请关注小李哦!

我们写的 Java 代码到底是如何运行起来的?

Java 程序通过 javac 编译成 .class 文件,然后虚拟机将其加载到元数据区,执行引擎将会通过混合模式执行这些字节码。执行时,会翻译成操作系统相关的函数。

过程如下:Java 文件->编译器->字节码->JVM->机器码

总结

本篇文章从三个角度了解了 JVM 在 Java 研发体系中的位置,并以一个简单的程序,看了下一个 Java 程序的执行过程。

我们说的 JVM,狭义上指的就是 HotSpot。如果没有特殊说明,我们都以 HotSpot 为准。

我们知道 Java 之所以跨平台,就是由于 JVM 的存在。Java 的字节码,是沟通 Java 语言与 JVM 的桥梁,同时也是沟通 JVM 与操作系统的桥梁。

JVM 是一个非常小的集合,我们常说的 Java 运行时环境,也就是 JRE 包含 JVM 和一部分基础类库。如果加上我们常用的一些开发工具,就构成了整个 JDK。

Java 虚拟机栈采用基于栈的架构,有比较丰富的 opcode。这些字节码可以解释执行,也可以编译成机器码,运行在底层硬件上,可以说 JVM 是一种混合执行的策略。

留两道思考题给大家:

栈上都会有哪些数据?

垃圾回收会发生在什么地方?

思考题我会在后面的章节为大家一一解答。

参考

?id=v_5e14662379d00_UAifIZpt

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydgww.html