0 前提知识
要学习Java虚拟机(Java Virtual Machine),您必须会Java的基本语法和Java特性
1 JVM内存结构
Java虚拟机的内存空间由以下的五个部分组成:
- 程序计数器(PC)
- Java虚拟机栈(Java Virtual Machine Stack)
- 本地方法栈
- 堆(Heap)
- 方法区(Method Area)
其中,程序计数器、本地方法栈和Java虚拟机栈是线程隔离的,即每个线程都拥有这三个东西,其他两个部分则是线程共享的,即所有线程所拥有的都是同一个堆和同一个方法区。线程隔离的数据区域会随着县城开始和结束而创建和销毁
图源:JVM内存结构
1.1 程序计数器
每一个Java虚拟机线程都有属于自己的PC(Program Counter)寄存器。在任意时刻,一个Java虚拟机线程只会执行一个方法的代码,而PC所指向的就是当前Java虚拟机正在执行的字节码指令的地址。如果当前线程所执行的方法是本地方法(native),那么此时程序计数器为Undefined
。
需要注意的是,在Java虚拟机中很多分支控制的指令都是跳转包括本身在内的指令条数,这是因为在取指之后,PC已经指向了下一条指令(即内容已经变成下一条指令的地址),而一般的跳转指令(如goto
,if<cond>
等)要求的都是从上一条指令的地址开始计算跳转的字节数。即我们需要根据如下公式来计算指令跳转的位置:
这部分留到字节码指令部分再具体介绍
程序计数器的作用
- 字节码解释器通过改变程序计数器来以此读取指令,从而实现代码的流程控制
- 在多线程情况下,程序计数器