转载自:http://glutinit.iteye.com/blog/1263446

延伸参考 JVM接收参数和方法调用

void spin() { 
   int   i; 
   for (i = 0; i < 100; i++) { 
        ; // Loop body is empty 
   } 
}

编译后的代码如下 (与《Java虚拟机规范(java SE 7)》上看到的不一样,不知道是不是JDK版本的问题)

void spin(); 
  Code: 
   0:   iconst_0 
   1:   istore_1 
   2:   iload_1 
   3:   bipush  100 
   5:   if_icmpge       14 
   8:   iinc    1, 1 
   11:  goto    2 
   14:  return

调用一个新的方法,就产生一个新的帧栈(Frame),如下图,在一个帧栈中,含有操作数栈(Operand Stack)和局部变量表(Local Variables),注意,此图只是用来表示在此期间发生的操作,并不直观的表示内存中的实际状态。

STEP1-->  0: iconst_0  

Code[]数组的第0行,表示把int型的0值压入操作数栈,注意,在局部变量表中,索引为0的位置存放的局部变量是指向调用当前方法的类实例的指针,即this指针

指令iconst_<i> 中的i表示的int 常量 −1、0、1、2、3、4、5

STEP2-->  1:   istore_1  

从操作数栈中弹出一个int型的操作数(即常量0),然后将其放置在局部变量1号位置(0号位置已被this占据)

注意:物理上讲出栈后原来的数还在,只是程序告诉用户这个格子可以用了,我们就拿它当空格子用,下次入栈的时候写个新的数就把原来的数覆盖掉。凡是可以随便写的格子,不管里面原来有什么,都被认为是空格子。

STEP3-->  2:  iload_1  

从局部变量表中获得1号位置变量的值,将其压入操作数栈

STEP4-->  3: bipush  100  

在操作数栈中加入int型的常量100

STEP5-->  5: if_icmpge   14  

该命令和《Java虚拟机规范》得到的不太一样,但起到的功能是一样的,可以查一下JVM 的在线文档,发现此命令的介绍如下:

if_icmpge  pops the top two ints off the stack and compares them. If value2 is greater than or equal to value1, execution branches to the address (pc + branchoffset), where pc is the address of the if_icmpge opcode in the bytecode and branchoffset is a 16-bit signed integer parameter following the if_icmpge opcode in the bytecode. If value2 is less than value1, execution continues at the next instruction.

即将操作数栈中的两个int值弹出栈,然后比较它们,如果value2(即这里的0)大于或等于value1(即这里的100),则跳转至14行执行,否则就继续执行。很显然,这里0<100,所以继续执行下面的代码。

STEP6-->  8:   iinc    1, 1  

该命令给局部变量表的1号位置的int值增加1,如图,原来的0变成了1

STEP7-->  11:  goto    2  
很显然,这一条的命令就是让下一条执行语句跳至2,即 iload_1,然后便继 
续执行…

STEP8-->  14:  return  
当局部变量1号位置的值(即程序中的i)大于100后,便满足了5: if_icmpge   14这条语句的条件,程序跳到14,遇到了return命令,该方法完成

JVM指令集介绍的更多相关文章

  1. JVM监控工具介绍

    JVM监控工具介绍 VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jst ...

  2. JVM指令集(指令码、助记符、功能描述)(转)

    JVM指令集(指令码.助记符.功能描述) 指令码 助记符 功能描述 0x00 nop 无操作 0x01 aconst_null 指令格式:  aconst_null 功能描述:  null进栈. 指令 ...

  3. JVM指令集

    指令集,其实就是一系列指令的集合.例如我们需要给一个局部变量赋予1这个值,即这个动作:int a = 1; 在我们看来,这很简单,但对于机器来说需要很多个动作.所以Java虚拟机指令集就是将这些常用的 ...

  4. JVM指令集(指令码、助记符、功能描述)

    JVM指令集(指令码.助记符.功能描述) 指令码 助记符 功能描述 0x00 nop 无操作 0x01 aconst_null 指令格式:  aconst_null 功能描述:  null进栈. 指令 ...

  5. 【转+存】JVM指令集

    jvm指令集: 转载地址:https://www.cnblogs.com/yaoyinglong/p/4300447.html 一.未归类系列A 此系列暂未归类. 指令码    助记符         ...

  6. 基于栈的指令集与基于寄存器的指令集的区别,JVM指令集实例

    现代JVM在执行Java代码的时候,通常都会将解释执行与编译执行两者结合起来 所谓解释执行,就是通过解释器来读取字节码,遇到相应的指令就去执行该指令. 所谓编译执行,就是通过即时编译器(Just In ...

  7. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta

    JVM监控工具介绍 jstack - 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程 ...

  8. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  9. Java内存泄露监控工具:JVM监控工具介绍

    本文将对JVM监控工具jstack, jconsole, jinfo, jmap, jdb, jstat进行详细的介绍,具体内容请看下文 Sun JDK监控和故障处理工具 名称 主要作用 jps JV ...

随机推荐

  1. myeclipse的导航器

    在myeclipse的导航器下面可以看到编译后的文件目录结构 如何打开导航器试图呢? 窗口->显示视图->导航器 windows->show view->Navigator 这 ...

  2. 4-51单片机WIFI学习(开发板51单片机自动冷启动下载原理)

    上一篇链接 http://www.cnblogs.com/yangfengwu/p/8743936.html 这一篇说一下自己板子的51单片机自动冷启动下载原理,我挥舞着键盘和鼠标,发誓要把世界写个明 ...

  3. 自己造轮子系列之OOM框架AutoMapper

    [前言] OOM框架想必大家在Web开发中是使用频率非常之高的,如果还不甚了解OOM框架,那么我们对OOM框架稍作讲解. OOM顾名思义,Object-Object-Mapping实体间相互转换.常见 ...

  4. leetcode算法:Island Perimeter

    You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...

  5. 赛码网算法: 军训队列( python实现 )

    军训队列 题目描述某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出 ...

  6. [洛谷P2024/POJ1182]食物链 - 带偏移量的并查集(2)

    Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

  7. Pymsql

    Pymsql 1.创建数据库连接 pymsql connect conn=pymysql.connect(host="localhost",user="root" ...

  8. codeforces round 425 div2

    A. Sasha and Sticks 水题,判断一下次数的奇和偶就可以的. B. Petya and Exam 赛上的时候没有写出来,orz,记录一下吧. 题意:给出一个模式串,可能会有?和*两种符 ...

  9. heightcharts点击曲线图获取返回值的问题(ios点击图表第一次无法触发点击事件解决方法)

    需求:用的heightcharts插件,点击曲线图想获得所点击点的返回值,如图 问题代码: (function chart_line(){ var data={"title":[& ...

  10. 参加Java培训到底靠不靠谱?

    导读 科技越发展,社会越进步,人们越便利,便衍生出更多的人从事程序员这个高大上的职业,可哈尔滨Java培训学校这么多,到底靠不靠谱,会不会处处是陷阱,爱尚实训帮你擦亮眼 随着时代的发展,越来越多的人对 ...