JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程

案例代码如下:

 1 public class JVMTest {
 2     public static Integer num = 10;
 3
 4     public int add(int i){
 5         int j = 5;
 6         int k = i+j;
 7         j++;
 8         k = num + j;
 9         return k;
10     }
11
12     public static void main(String[] args){
13         System.out.println(new JVMTest().add(4));
14     }
15 }

编译之后主要指令集如下:

 1 {
 2   public static java.lang.Integer num;
 3     descriptor: Ljava/lang/Integer;
 4     flags: ACC_PUBLIC, ACC_STATIC
 5
 6   public com.lucky.grpc.JVMTest();
 7     descriptor: ()V
 8     flags: ACC_PUBLIC
 9     Code:
10       stack=1, locals=1, args_size=1
11          0: aload_0
12          1: invokespecial #1                  // Method java/lang/Object."<init>":()V
13          4: return
14       LineNumberTable:
15         line 3: 0
16
17   public int add(int);
18     descriptor: (I)I
19     flags: ACC_PUBLIC
20     Code:
21       stack=2, locals=4, args_size=2
22          0: iconst_5
23          1: istore_2
24          2: iload_1
25          3: iload_2
26          4: iadd
27          5: istore_3
28          6: iinc          2, 1
29          9: getstatic     #2                  // Field num:Ljava/lang/Integer;
30         12: invokevirtual #3                  // Method java/lang/Integer.intValue:()I
31         15: iload_2
32         16: iadd
33         17: istore_3
34         18: iload_3
35         19: ireturn
36       LineNumberTable:
37         line 7: 0
38         line 8: 2
39         line 9: 6
40         line 10: 9
41         line 11: 18
42
43   public static void main(java.lang.String[]);
44     descriptor: ([Ljava/lang/String;)V
45     flags: ACC_PUBLIC, ACC_STATIC
46     Code:
47       stack=3, locals=1, args_size=1
48          0: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
49          3: new           #5                  // class com/lucky/grpc/JVMTest
50          6: dup
51          7: invokespecial #6                  // Method "<init>":()V
52         10: iconst_4
53         11: invokevirtual #7                  // Method add:(I)I
54         14: invokevirtual #8                  // Method java/io/PrintStream.println:(I)V
55         17: return
56       LineNumberTable:
57         line 15: 0
58         line 16: 17
59
60   static {};
61     descriptor: ()V
62     flags: ACC_STATIC
63     Code:
64       stack=1, locals=0, args_size=0
65          0: bipush        10
66          2: invokestatic  #9                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
67          5: putstatic     #2                  // Field num:Ljava/lang/Integer;
68          8: return
69       LineNumberTable:
70         line 4: 0
71 }

其中第17行到第41行是add方法的指令,接下来就一行一行图解虚拟机栈是如何执行的!

第一步:iconst_5  :将int类型的常量5压入操作数栈

第二步:istore_2 :将操作数栈顶中int类型数据放入局部常量表下标为2的位置,从0开始数也就是第三个位置

第三步:iload_1 :

原文地址:https://www.cnblogs.com/jackion5/p/10693433.html

时间: 2024-08-30 09:43:23

JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程的相关文章

Jvm(59),虚拟机字节码执行引擎----运行时栈帧结构

后面讲的所有的东西就是对前面所总览的虚拟机栈的进一步理解. 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)[1]的栈元素.栈帧存储了方法的局部变量表.操作数栈.动态连接和方法返回地址等信息.每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程. 每一个栈帧都包括了局部变量表.操作数栈.动态连接.方法返回地址和一些额外的附加信息.在编译程序代码的时候,

JVM系列一:虚拟机内存区域

虚拟机栈 1.虚拟机栈维护一个线程中所有方法的栈帧,每个栈帧中保存着这个方法中用到的局部变量表,操作数栈,常量引用 2.可以用-Xss来设置每个线程中虚拟机栈的大小,在jdk1.4之前默认虚拟机栈大小是256K,在jdk1.5+默认虚拟机栈大小是1M java -Xss2M HackTheJava 3.该区域可能抛出的异常 当线程请求的栈深度超过最大限制后,或抛出StackOverflowError 当栈进行动态扩展无法申请到内存后,会抛出OutOfMemoryError 本地方法栈 本地方法栈

[转]JVM内幕:Java虚拟机详解

本文由 ImportNew - 挖坑的张师傅 翻译自 jamesdbloom.欢迎加入翻译小组.转载请见文末要求. 这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守Java SE 7 规范的典型的 JVM 核心内部组件. 上图显示的组件分两个章节解释.第一章讨论针对每个线程创建的组件,第二章节讨论了线程无关组件. 线程 JVM 系统线程 每个线程相关的 程序计数器 栈 本地栈 栈限制 栈帧 局部变量数组 操作数栈 动态链接 线程共享 堆 内存管理 非堆内存 即时编译 方法区 类

JVM内幕:Java虚拟机详解

这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守Java SE 7 规范的典型的 JVM 核心内部组件. 上图显示的组件分两个章节解释.第一章讨论针对每个线程创建的组件,第二章节讨论了线程无关组件. 线程 JVM 系统线程 每个线程相关的 程序计数器 栈 本地栈 栈限制 栈帧 局部变量数组 操作数栈 动态链接 线程共享 堆 内存管理 非堆内存 即时编译 方法区 类文件结构 类加载器 更快的类加载 方法区在哪里 类加载器参考 运行时常量池 异常表 符号表 Interned 字符串

JVM学习笔记-操作数栈(Operand Stack)

Like the local variables, the operand stack is organized as an array of words. But unlike the local variables, which are accessed via array indices, the operand stack is accessed by pushing and popping values. If an instruction pushes a value onto th

Jvm(39),class文件结构----- 方法表集合

类中定义的method方法是如何在class文件中组织的 method方法的表示-方法表集合在class文件的什么位置 类中的method方法的实现代码---即机器码指令存放到哪了,并初步了解机器指令 为什么没有在类中定义自己的构造函数,却可以使用new ClassName()构造函数创建对象 IDE代码提示功能的基本原理 1.概述 方法表集合是指由若干个方法表(method_info)组成的集合.对于在类中定义的若干个,经过JVM编译成class文件后,会将相应的method方法信息组织到一个

Java逆向基础之操作数栈

本文参考:http://www.vuln.cn/7115 本地变量和操作数栈 本地变量数组(Local Variable Array) 本地变量的数组包括方法执行所需要的所有变量,包括 this 的引用,所有方法参数和其他本地定义的变量.对于那些方法(静态方法 static method)参数是以零开始的,对于实例方法,零为 this 保留. 所有的类型都在本地变量数组中占一个槽(entry),而 long 和 double 会占两个连续的槽,因为它们有双倍宽度(64-bit 而不是 32-bi

编译器架构的王者LLVM——(9)栈式符号表的构建

LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 -- 题记 版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.csdn.net/xfxyy_sxfancy 栈式符号表的构建 栈式符号表对于一款编译器,无疑是核心的组件. 无论你在做什么符号扫描,那么都离不开符号表,如何得知一个符号是否定义,以及它的类型,那么唯有查看符号表中的记录. 栈式符号表并不复杂,但思

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.