JVM入门

82 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

走进JVM

我们在JavaSE阶段的开篇就进行介绍了,我们的Java程序之所以能够实现跨平台,本质就是因为它是运行在虚拟机之上的,而不同平台只需要安装对应平台的Java虚拟机即可运行(在JRE中包含),所有的Java程序都采用统一的标准,在任何平台编译出来的字节码文件(.class)也是同样的,最后实际上是将编译后的字节码交给JVM处理执行。

也正是得益于这种统一规范,除了Java以外,还有多种JVM语言,比如Kotlin、Groovy等,它们的语法虽然和Java不一样,但是最终编译得到的字节码文件,和Java是同样的规范,同样可以交给JVM处理。

技术概述

首先我们要了解虚拟机的具体定义,我们所接触过的虚拟机有安装操作系统的虚拟机,也有我们的Java虚拟机,而它们所面向的对象不同,Java虚拟机只是面向单一应用程序的虚拟机,但是它和我们接触的系统级虚拟机一样,我们也可以为其分配实际的硬件资源,比如最大内存大小等。

并且Java虚拟机并没有采用传统的PC架构,比如现在的HotSpot虚拟机,实际上采用的是基于栈的指令集架构,而我们的传统程序设计一般都是基于寄存器的指令集架构,这里我们需要回顾一下计算机组成原理中的CPU结构:

其中,AX,BX,CX,DX 称作为数据寄存器:

  • AX (Accumulator):累加寄存器,也称之为累加器;
  • BX (Base):基地址寄存器;
  • CX (Count):计数器寄存器;
  • DX (Data):数据寄存器;

这些寄存器可以用来传送数据和暂存数据,并且它们还可以细分为一个8位的高位寄存器和一个8位的低位寄存器,除了这些通用功能,它们各自也有自己的一些专属职责,比如AX就是一个专用于累加的寄存器,用的也比较多。

SP 和 BP 又称作为指针寄存器:

  • SP (Stack Pointer):堆栈指针寄存器,与SS配合使用,用于访问栈顶;
  • BP (Base Pointer):基指针寄存器,可用作SS的一个相对基址位置,用它可直接存取堆栈中的数据;

SI 和 DI 又称作为变址寄存器:

  • SI (Source Index):源变址寄存器;
  • DI (Destination Index):目的变址寄存器;

主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

控制寄存器:

  • IP (Instruction Pointer):指令指针寄存器;
  • FLAG:标志寄存器;

段寄存器:

  • CS (Code Segment):代码段寄存器;
  • DS (Data Segment):数据段寄存器;
  • SS (Stack Segment):堆栈段寄存器;
  • ES (Extra Segment):附加段寄存器;