案例代码如下:

 public class JVMTest {
public static Integer num = 10; public int add(int i){
int j = 5;
int k = i+j;
j++;
k = num + j;
return k;
} public static void main(String[] args){
System.out.println(new JVMTest().add(4));
}
}

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

 {
public static java.lang.Integer num;
descriptor: Ljava/lang/Integer;
flags: ACC_PUBLIC, ACC_STATIC public com.lucky.grpc.JVMTest();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0 public int add(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
stack=2, locals=4, args_size=2
0: iconst_5
1: istore_2
2: iload_1
3: iload_2
4: iadd
5: istore_3
6: iinc 2, 1
9: getstatic #2 // Field num:Ljava/lang/Integer;
12: invokevirtual #3 // Method java/lang/Integer.intValue:()I
15: iload_2
16: iadd
17: istore_3
18: iload_3
19: ireturn
LineNumberTable:
line 7: 0
line 8: 2
line 9: 6
line 10: 9
line 11: 18
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=1, args_size=1
0: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
3: new #5 // class com/lucky/grpc/JVMTest
6: dup
7: invokespecial #6 // Method "<init>":()V
10: iconst_4
11: invokevirtual #7 // Method add:(I)I
14: invokevirtual #8 // Method java/io/PrintStream.println:(I)V
17: return
LineNumberTable:
line 15: 0
line 16: 17 static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: bipush 10
2: invokestatic #9 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: putstatic #2 // Field num:Ljava/lang/Integer;
8: return
LineNumberTable:
line 4: 0
}

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

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

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

第三步:iload_1 :

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

  1. 从 i++ 和 ++i 说起局部变量表和操作数栈

    本文转载自:从 i++ 和 ++i 说起局部变量表和操作数栈 最近公司有人看了尚硅谷柴林燕老师的第一季面试题,就想来考考我.我觉得柴老师讲的很好,部分内容可以延伸一下,所以写这篇文章分享给大家! 这篇 ...

  2. JVM 栈帧之操作数栈与局部变量表

    目录 前置知识 引子 基于寄存器的设计模式 基于栈的设计模式 一个简单的例子 如何查看局部变量表? 实例方法中的局部变量表 结论 前置知识 阅读本文需要对以下知识有所了解: * 栈 * 汇编 * Ja ...

  3. JVM探秘1--JVM内存运行时区域划分

    Java程序员一般不需要太关注内存,因为操作内存的权力都交给了Java虚拟机,但是Java程序员必须需要了解JVM是如何使用内存的,否则一旦内存出现泄漏或事溢出的话,就会一筹莫展不知道从哪去入手排查问 ...

  4. JVM(一)虚拟机内存划分

    Java内存区域 线程私有数据区域:虚拟机栈,本地方法栈,程序计数器 线程共享数据区域:方法区,堆 程序计数器:当前线程所执行的字节码的行号指示器,JVM通过这个字节码解释器改变计数器的值,以选择下一 ...

  5. 深入理解JVM(一)虚拟机内存

    一 .前言 JVM是什么,我想诸位肯定都清楚. 好吧,我还是简答说一下JVM即Java虚拟机(够简单吧 233333). 虽然说,所有抛开操作系统,讲虚拟机的内容,都是耍流氓.但是,贫僧不修善果,就爱 ...

  6. JVM探秘:Java内存区域

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出 ...

  7. <JVM上篇:内存与垃圾回收篇>04-虚拟机栈

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  8. Java虚拟机一 运行时数据区(栈、堆、方法区等)

    Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的 ...

  9. 【Java】JVM(六)虚拟机字节码执行引擎

    一.概述 执行引擎是虚拟机中最核心的部分之一, 虚拟机自己实现引擎,自己定义指令集和执行引擎的结构体系. 二.栈帧 栈帧包含(1)局部变量表.(2)操作数栈.(3)动态链接.(4)方法返回地址.(5) ...

随机推荐

  1. Java 整数型的进制间的互相转换

    /** * 整数型, 进制间的互相转换 */ public class IntConversion { public static void main(String[] args) { int num ...

  2. C# 与Sql server 获取数据和执行命令

    C#数据库命封装在 System.Data.SqlClient 之中: 从使用的数据库中获取连接串connectionstring:"server=xx.xxx.xx.xx,xxxx: da ...

  3. JS-词法作用域 作用域链

    ## 词法作用域 概念:所谓的词法作用域,就是代码在编写过程就体现出来的作用范围.代码一旦写好,不用执行, 作用范围就已经确定好了,这个就是所谓的词法作用域. ## 词法作用域的规则: 1,函数允许访 ...

  4. 报Error creating bean with name 'dataSource' defined in class path resource 报错解决办法

    在学习spring boot 的数据库操作的时候,报了一串错误 对于初学spring boot的我来说,英语水平低,看不懂报错的信息,给我造成了很大的麻烦,花了我一天的时间,经过不懈的努力后终于让我找 ...

  5. 壁虎书7 Ensemble Learning and Random Forests

    if you aggregate the predictions of a group of predictors,you will often get better predictions than ...

  6. jpython basic

    https://blog.csdn.net/zhongweijian/article/details/4742549https://www.jython.org/downloads.htmlhttps ...

  7. ItunesConnect:"Missing Push Notification Entitlement"警告-----以及解决方法

    最近开发的cordova应用,要做ios的适配,并且发布版本,但是有一次在发测试版本的时候,突然收到一封邮件警告,原文如下: Missing Push Notification Entitlement ...

  8. urllib库的应用及简单爬虫的编写

    1.urllib库基础 1.1爬虫的异常处理 常见状态码及含义 301 Moved Permanently:重定向到新的URL,永久性 302 Found:重定向到临时的URL,非永久性 304 No ...

  9. TZOJ 5271: 质因数的个数

    求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N< ...

  10. linux netcat 命令详解

    功能说明:强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...