• JVM之栈帧解析


    概述

    学习JVM内存模型中,一定会涉及到虚拟机栈,而栈帧是虚拟机栈的主要组成部分,这里详细介绍下栈帧到底是什么以及是怎么运行的,内容主要包括:

    1.JVM栈及栈帧的介绍

    2.代码执行过程中栈帧的变化过程

    JVM栈及栈帧的介绍

    我们都知道虚拟机栈,它是每个线程私有的运行时堆栈,每个方法会创建一个栈帧,栈帧主要包含:本地变量列表、操作数栈、指向常量池的指针、返回地址。

    代码执行过程中栈帧的变化过程

    在代码执行过程中,栈帧的变化过程及步骤是什么样的那,我们通过一个代码示例详细讲解下,代码如下:

    public class TestDemo {
        public static void main(String [] args){
            int a=1;
            int b=1;
            int c=a+b;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这是一个很简单的代码,就是局部变量a,b初始化为1,c是有a+b计算得到,那么编译后看到的字节码如下:

    stack=2,locals=4,args_size=1
    0:iconst_1
    1:istore_1
    2:iconst_1
    3:istore_2
    4:iload_1
    5:iload-2
    6:iadd
    7:istore_3
    8:return
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们一步一步的讲解下,从0到8JVM的执行过程中栈帧的各部分变化:

    1)0:iconst_1 其实是代表的是我们的局部变量a=1,这时候是将1入栈(操作数栈)。

    2)1:istore_1这步那是将1这个值从操作数栈中取出,放到局部变量表中,这时候局部变量表中就有一个值1

    3)2:iconst_1 和3:istore_2 这两个指令那跟1)2)不是一样的,只不过是将b=1压栈,出栈放到局部量表中,执行完这两个后,局部变量表中就会存在两个变量啊a,b了。

    4)4:iload_1,5:iload-2分别是将a、b两个变量值从局部量表取出放入操作数栈中。

    5)6:iadd 其实执行的是c=a+b,就是将a和b从栈中取出相加,同时将结果2放入操作数栈,。

    6)7:istore_3是指将c=2放到局部变量表中,这时候局部变量表就有3个变量值了。

    7)8:return 就是直接返回了,这个具体不细讲了。

    具体如下图:

  • 相关阅读:
    java ssm在线读书与分享论坛系统
    MYSQL数据库管理与创建
    Matlab软件使用教学
    sql添加索引
    WebDAV之葫芦儿·派盘 + Koder
    Oracle中计算除法——解决除数为零报错
    leetcode 23. 合并K个升序链表
    Qt将GeoJson文件转为mif文件的示例
    领导批评的点需改正
    systemd的unit配置文件详解
  • 原文地址:https://blog.csdn.net/geejkse_seff/article/details/126743612