方法在栈帧中的执行

简介: jvm虚拟机(HotSpot)主要组成部分:程序计数器、方法区、虚拟机栈、本地方法栈、堆。其中程序计数器与虚拟机栈、本地方法栈是线程私有,随着线程的创建产生,随着线程消亡而消失。

方法在栈帧中的执行(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文件信息。


20201113164255291.png


由上图可以看出,方法的变量都会先经过操作数栈才会进入到局部变量表,而对局部变量操作时,也需要先将局部变量表中的数据入栈后才能执行计算,引用数据类型其实也是一样都是先经过操作数栈才会进入局部变量表。这就是一个方法在栈帧中的简单过程。


如有不对请指证,谢谢。

相关文章
|
6天前
|
存储 Java 容器
深入浅出 栈和队列(附加循环队列、双端队列)
深入浅出 栈和队列(附加循环队列、双端队列)
|
4天前
|
算法 编译器 Python
栈的最后表演:逆波兰表达式求值
栈的最后表演:逆波兰表达式求值
|
7天前
<数据结构>栈和队列. 顺序表实现栈,单链表实现队列.
<数据结构>栈和队列. 顺序表实现栈,单链表实现队列
18 3
|
7天前
|
存储 测试技术 计算机视觉
栈和队列经典练习题
栈和队列经典练习题
18 3
|
7天前
|
C++
数据结构深入理解--栈
数据结构深入理解--栈
17 0
|
7天前
|
Java 索引
Java数据结构——栈
Java数据结构——栈
19 1
|
10天前
|
缓存 Java 编译器
JavaSE精选-栈和队列
JavaSE精选-栈和队列
18 1
|
11天前
|
缓存 Java 编译器
栈和队列技术文章
栈和队列技术文章