资讯专栏INFORMATION COLUMN

JVM系列(1)-变量

haobowd / 1577人阅读

摘要:我们对做下拆解,一个常量,一个变量。因为带有两个参数,所以在局部变量索引索引为的位置插入,在索引为的位置插入。

前言

这段时间一直在看JVM相关的书籍,虽然有点难,至少到目前为止还没有放弃。写这篇文章的目的:当做自己这段时间学习的小回顾。本章主要通过几个代码片段,分析下局部变量表与操作数栈之间的数据传递关系,重点讲解iload,istore,iconst_,iadd命令

提前了解 JVM的几个概念

局部变量表:每个栈帧内部都包含一组称为局部变量表的变量列表

操作数栈:每个栈帧内部都包含一个操作数栈

iconst_0:把int型的0值压入操作数栈

iload:将一个局部变量加载到操作数栈上

istore:将一个数值从操作数栈上存储到局部变量表中

iadd:返回栈顶的两个元素做加法运算,并加结果压栈

如何使用dos查看字节码文件

首先通过dos进入TestApp.class所在的目录,然后运行命令javap -c TestApp,即可看到编译后的字节码文件

程序片段一

以下是一个java源代码

public void test1(){      
    int c=0;              
}                         

编译后的字节码

  public void test1();
    Code:
       0: iconst_0
       1: istore_1
       2: return

代码分析

因为test1()是一个实例方法,所以在局部变量表中,索引为0的位置会保存该方法所在类的引用(this),所以才会出现istore_1而不是istore_0

我们对int c = 0做下拆解,一个常量0,一个变量c。

0: iconst_0   //将常量0压入操作数栈
1: istore_1   //将栈顶出栈,即c=0
2: return      //因为是void,没有返回值
程序片段二

Java源代码如下

public static void test2(){    
    int c=0;                   
}                              

编译后的字节码文件

  public static void test2();
    Code:
       0: iconst_0
       1: istore_0
       2: return

分析

因为test2()是一个静态的方法,不会在局部变量表中插入任何数据。所以你看到的是istore_0而不是像程序片段一中的istore_1。其他分析跟程序片段一相同

程序片段三

java源代码

public int test3(){         
    int c=0;                
    return c;               
}                           

编译后的字节码

  public int test3();
    Code:
       0: iconst_0
       1: istore_1
       2: iload_1
       3: ireturn

分析

0: iconst_0        //将常量0压栈
1: istore_1     //将栈顶出栈,及c=0
2: iload_1      //将变量c压入栈顶
3: ireturn        //返回栈定元素
程序片段四

Java源代码

public int test4(int a,int b){       
    int c=0;                         
    return a+b;                      
}                                    

编译后的字节码

  public int test4(int, int);
    Code:
       0: iconst_0
       1: istore_3
       2: iload_1
       3: iload_2
       4: iadd
       5: ireturn

** 分析

因为test4(int a,int b)是实例方法,所以在局部变量表索引为0的位置会插入this
因为test4(int a,int b)带有两个参数,所以在局部变量索引索引为1的位置插入a,在索引为2的位置插入b。

0: iconst_0        //将常量0压栈
1: istore_3        //将栈顶出栈,即c=0,将c存储到局部变量表索引为3的位置
2: iload_1        //将局部变量表中索引为1的变量压栈,即a压栈
3: iload_2        //将局部变量表中索引为2的变量压栈,即b压栈
4: iadd            //将栈顶两个元素出栈,做加法,然后把结果再入栈(即a,b出栈,将a+b入栈)
5: ireturn        //返回a+b的值
程序片段五

java源代码

public int test5(int a,int b){    
    int c=0;                      
    c= a+b;                       
    return c;                     
}                                 

编译后的字节码

  public int test5(int, int);
    Code:
       0: iconst_0
       1: istore_3
       2: iload_1
       3: iload_2
       4: iadd
       5: istore_3
       6: iload_3
       7: ireturn

分析

0: iconst_0        //将常量0压栈
1: istore_3        //将栈顶出栈,及c=0
2: iload_1        //从局部变量表中加载索引为1的变量压栈,即a压栈
3: iload_2        //从局部变量表中加载索引为2的变量压栈,即b压栈
4: iadd            //将栈顶两个元素出栈,做加法,然后将结果压栈,及a+b压栈
5: istore_3        //将栈顶元素出栈,并保存到局部变量表中,即c=a+b
6: iload_3        //从局部变量表中加载索引为3的变量压栈,即c压栈
7: ireturn        //返回栈顶元素,即返回c

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66815.html

相关文章

  • 从一无所知到无所不知————jvm系列1

    摘要:学习能更深入的理解这门语言,能理解语言底层的执行过程,深入到字节码层次。 目录   前言 程序的运行 1.JVM类加载机制 ①一般在什么情况下会去加载一个类?也就是说,什么时候.class字节码文件中加载这个类到JVM内存里来? ②验证、准备、初始化 ③初始化 2.类加载器和双亲委派机制 ...

    Betta 评论0 收藏0
  • 《深入理解java虚拟机》学习笔记系列——java内存区域划分

    摘要:运行时数据区域的学习,是学习以及机制的基础,也是深入理解对象创建及运行过程的前提。了解内存区域划分,是学习概念的前提。 Java 运行时数据区域的学习,是学习 jvm 以及 GC 机制的基础,也是深入理解 java 对象创建及运行过程的前提。废话不多说,直接进入正题: 一张图总结 showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...

    史占广 评论0 收藏0
  • 【Java系列】从字节码角度深度理解Java函数调用传参方式

    摘要:下文将从字节码的角度,分析中基本类型传参和对象传参。主函数执行时,操作栈会推入主函数栈帧,其中包含了主函数的局部变量表,字节码,返回值等信息。主函数的栈帧会被推入栈,成为当前操作栈。 个人网站地址: http://kailuncen.me/2017/06/0... 一个小问题 在开源中国看到这样一则问题 https://www.oschina.net/quest...,其中的变量a前...

    LdhAndroid 评论0 收藏0
  • JVM系列(一):深入详解JVM 内存区域总结!

    摘要:一内存区域虚拟机在运行时,会把内存空间分为若干个区域,根据虚拟机规范版的规定,虚拟机所管理的内存区域分为如下部分方法区堆内存虚拟机栈本地方法栈程序计数器。前言 在JVM的管控下,Java程序员不再需要管理内存的分配与释放,这和在C和C++的世界是完全不一样的。所以,在JVM的帮助下,Java程序员很少会关注内存泄露和内存溢出的问题。但是,一旦JVM发生这些情况的时候,如果你不清楚JVM内存的...

    Aldous 评论0 收藏0
  • 【效率专精系列】几种常见的JVM热部署技术及实现难点浅谈

    摘要:而热部署技术能够帮助开发人员减少重新部署的等待时间。本文的目的为调研热部署的技术现状及其对开发效率的帮助,并简单梳理其技术实现的难点。热部署技术总结热部署目前有多种技术实现官方开源商业。 开发、自测、联调期间代码可能会被频繁地修改,通常即使只增加了一行代码,都需要重启容器以检查执行效果。而热部署技术能够帮助开发人员减少重新部署的等待时间。本文的目的为调研热部署的技术现状及其对开发效率的...

    dongfangyiyu 评论0 收藏0

发表评论

0条评论

haobowd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<