JVM-Learning

0 前提知识

要学习Java虚拟机(Java Virtual Machine),您必须会Java的基本语法Java特性

1 JVM内存结构

Java虚拟机的内存空间由以下的五个部分组成:

  1. 程序计数器(PC)
  2. Java虚拟机栈(Java Virtual Machine Stack)
  3. 本地方法栈
  4. 堆(Heap)
  5. 方法区(Method Area)

其中,程序计数器、本地方法栈和Java虚拟机栈是线程隔离的,即每个线程都拥有这三个东西,其他两个部分则是线程共享的,即所有线程所拥有的都是同一个堆和同一个方法区。线程隔离的数据区域会随着县城开始和结束而创建和销毁

图源:JVM内存结构

1.1 程序计数器

每一个Java虚拟机线程都有属于自己的PC(Program Counter)寄存器。在任意时刻,一个Java虚拟机线程只会执行一个方法的代码,而PC所指向的就是当前Java虚拟机正在执行的字节码指令的地址。如果当前线程所执行的方法是本地方法(native),那么此时程序计数器为Undefined

需要注意的是,在Java虚拟机中很多分支控制的指令都是跳转包括本身在内的指令条数,这是因为在取指之后,PC已经指向了下一条指令(即内容已经变成下一条指令的地址),而一般的跳转指令(如gotoif<cond>等)要求的都是从上一条指令的地址开始计算跳转的字节数。即我们需要根据如下公式来计算指令跳转的位置:

pc=pcintsrLength+offsetpc = pc - intsrLength + offset

这部分留到字节码指令部分再具体介绍

程序计数器的作用

  • 字节码解释器通过改变程序计数器来以此读取指令,从而实现代码的流程控制
  • 在多线程情况下,程序计数器