方法在栈帧中的执行(jdk8)
1.虚拟机栈组成部分
jvm虚拟机(HotSpot)主要组成部分:程序计数器、方法区、虚拟机栈、本地方法栈、堆。
其中程序计数器与虚拟机栈、本地方法栈是线程私有,随着线程的创建产生,随着线程消亡而消失。
方法区与堆则是线程共享的区域。
2.栈有哪些组成部分?
栈的组成部分是一个个的栈帧,java中方法的调用对应的就是栈帧的入栈以及出栈操作(方法调用一次就会对应一次入栈),栈是线程私有、读写速度较快,但内存较小、默认大小1024kb,因为是线程私有的,所以每个线程都可以设置自己的栈空间大小,可使用 -Xss1M ,且栈内的值是共享的,通常说基本数据类型存放于栈中,其实就是存放于栈帧中,栈帧之间相互独立,一个栈帧内的数据可以共享,打个比方
int a = 1; int b = 1;
上面这些代码,在一个栈帧中其实只有一个1存在,两个变量其实都是引用的一个值,这就是栈的数据共享。(创建一个基本类型变量,栈先去空间寻找有无该值,有引用,无创建)
3.栈帧有哪些组成部分?
栈帧包括:局部变量表(存储方法中的局部变量)、操作数栈(存储中间变量,数据的计算需要先入栈)、动态链接、返回地址。
举一个程序栗子用以解释方法在栈帧中的执行过程:
public void test1(){ int i = 6; int j = 9; int h = i + j; }
看下这段程序对应的class文件信息,使用javap -verbose Test.class 命令可查看class文件信息。
由上图可以看出,方法的变量都会先经过操作数栈才会进入到局部变量表,而对局部变量操作时,也需要先将局部变量表中的数据入栈后才能执行计算,引用数据类型其实也是一样都是先经过操作数栈才会进入局部变量表。这就是一个方法在栈帧中的简单过程。
如有不对请指证,谢谢。