一、JVM的整体流程
JVM在运行过程中会把它所管理的内存划分成若干不同的数据区域!
- 线程私有:程序计数器、虚拟机栈、本地方法栈
- 线程共享:堆、方法区
二、线程私有
- 程序计数器
指向当前线程正在执行的字节码指令的地址(行号),JVM里面唯一不会发生OOM的区域。
java是多线程,为了记录线程之间的切换。确保在多线程的情况下能正常执行。 - 本地方法栈
其实就是native方法调用了jni层。例如:Object.hashCode();该方法就是调用了native方法 - 虚拟机栈
每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。
局部变量:其实就是存储了方法里的局部变量。
操作数栈:其实就是我们在方法方法里面所操作的代码,相当于是一个栈,操作的元素在栈里一直运行入栈/出栈的操作。
动态链接:就是java的多态
方法出口(返回地址):结果返回
例子:
public class JavaStack {
public void king(int money){
money = money -100;
}
public static void main(String[] args)throws Throwable {
JavaStack javaStack = new JavaStack();
javaStack.king(10000);
}
}
在命令行里面输入:javap -c -v JavaStack.clss > a.txt
重定向输出一个反编译的文件,这个文件其实就是king方法里面的一个虚拟机栈的操作流程
public void king(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: iload_1
1: bipush 100
3: isub
4: istore_1
5: return
LineNumberTable:
line 11: 0
line 12: 5
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 this Lcom/jvm/ch01/JavaStack;
0 6 1 money I
我这边通过图来分析:
这一节只介绍线程私有的,下一节在仔细分析线程共享,深入理解JVM之堆内存(年经代,老年代)