《深入拆解Java虚拟机》学习笔记 Day01

73 阅读3分钟

预备知识

什么是栈帧

栈帧是一个单位

虚拟机栈是线程私有的内存区域。虚拟机栈的内存空间是给线程使用的,每个线程启动后,虚拟机为其分配一块栈内存空间,虚拟机栈中存在多个栈帧

每个线程分配的虚拟机栈内存区域由多个栈帧(Frame)组成,栈帧对应着每个方法调用时所占用的内存;

每个栈帧的由局部变量表操作数栈动态链接方法返回值地址等组成。

可参考这篇文章 gk.link/a/11UEQ

image.png

JVM是什么

类比

核心类库的 API -> 数学公式

Java 虚拟机的知识 -> 公式的推导过程

掌握数学公式固然可以应付考试,但是了解背后的推导过程更加有助于记忆和理解。并且,在遇到那些没法套公式的情况下,我们也能知道如何解决。

举例来说,macOS上的Java 10共有近千个配置参数,查看Java的参数列表命令

$ java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l

为什么Java要在虚拟机里运行

因为语法复杂,抽象程度高

可以一次编译到处运行

具体的代码转换如何做

当前的主流思路 :

  • 设计一个面向 Java 语言特性的虚拟机;
  • 并通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列,也称 Java 字节码,之所以这么取名,是因为 Java 字节码指令的操作码(opcode)被固定为一个字节。

从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。

加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。 这和x86段式内存管理中的代码段类似。而且,Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。

不同的是,Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

image.png

每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧(上面的预备知识有提到),用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。

运行时内存划分

Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。 Java 程序编译而成的 class 文件,需要先加载至方法区中,方能在 Java 虚拟机中运行。

课程链接:深入拆解Java虚拟机_JVM_Java底层-极客时间 (geekbang.org)