Run-time data areas
一.概述
- PC(program counter):存放指令位置
虚拟机的运行类似如下循环
while(not end) {
取PC中的位置,找到对应位置的指令;
执行该指令;
PC++;
}
- JVM stacks:每个java线程独有一个栈,里面装的是栈帧,整个方法执行过程中都会和Heap打交道,把new出来的对象放到堆里
栈帧:每个方法对应一个栈帧,栈帧的内容如下
- 局部变量表:一个方法里的所有局部变量
- Operand Stacks:每个局部变量都有自己的操作数栈
- Dynamic Linking:动态链接是一个将符号引用解析为直接引用的过程。java虚拟机执行字节码时,遇到一个操作码,操作码第一次使用一个指向另一类的符号引用,则虚拟机就必须解析这个符号引用。解析时需要执行三个任务:
- 查找被引用的类(有必要的话就装载它,一般采用延时装载)
- 将符号引用(class文件常量池里的那些符号链接)替换为直接引用,这样当再次遇到相同的引用时,可以使用这个直接引用,省去再次解析的步骤
- 当java虚拟机解析一个符号引用时,class文件检查器的第四趟扫描确保了这个引用是合法的
- return address:返回值地址,若方法a调用方法b,b方法有返回值,b执行结束后就应该到a的return address上继续执行
- Heap:详情请戳
- Native Method stacks:本地方法栈,即C和C++方法,Java调用的JNI,等同于Java自身的栈
- Direct Memory:JDK1.4之后增加的,NIO会用到,为了增加IO的效率
- Method area:存储class里的结构和内容
小于1.8的时候FGC是不会清理的,大于1.8会自动清理,实现如下
- Perm Space(<1.8):字符串常量位于Perm Space,FGC不会清理,大小启动时指定,不变
- Meta Space(>=1.8):字符串常量位于Heap,FGC会清理,若不设定,最大是物理内存
二.JVM常用指令(TODO)
1. invoke指令
- InvokeStatic:调用静态方法
- InvokeVirtual:自带多态,new一个对象调用其普通成员方法时,会将该对象压入操作数栈,调用的就是该对象的方法
- InvokeInterface:使用interface调用方法时用到
- InvokeSpecial:private方法不用多态,调用时就用的invokeSpecial
- InvokeDynamic:动态语言(eg:lamda表达式在运行时产生的类)