官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

原文地址:http://www.linmuxi.com/2016/02/25/jvm-int-pushstack-01/

本篇主要分享下在JVM中int类型数值采用何种指令入栈的,根据int值范围JVM入栈字节码指令就分为4类,下面分别介绍下这四类指令。

前言

当int取值-1~5采用iconst指令,取值-128~127采用bipush指令,取值-32768~32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。

iconst

当int取值-1~5时,JVM采用iconst指令将常量压入栈中。
定义Test.java文件

 public static void main(String[] args) {
     int i = 5;
     int j = -1;
 }

查看class文件

 public static void main(java.lang.String[]);
 Code:
 0: iconst_5
 1: istore_1
 2: iconst_m1
 3: istore_2
 4: return
 }

分析class文件,int取值0~5时JVM采用iconst_0、iconst_1、iconst_2、iconst_3、iconst_4、iconst_5指令将常量压入栈中,取值-1时采用iconst_m1指令将常量压入栈中。

bipush

当int取值-128~127时,JVM采用bipush指令将常量压入栈中。
定义Test.java文件

 public static void main(String[] args) {
     int i = 127;
 }

查看class文件

 public static void main(java.lang.String[]);
 Code:
 0: bipush 127
 2: istore_1
 3: return
 }

可以看到上面代码第三行是采用bipush指令将常量127压入栈中。

sipush

当int取值-32768~32767时,JVM采用sipush指令将常量压入栈中。
定义Test.java文件

 public static void main(String[] args) {
     int i = 32767;
 }

查看class文件

 public static void main(java.lang.String[]);
 Code:
 0: sipush 32767
 3: istore_1
 4: return
 }

可以看到上面代码第三行是采用sipush指令将常量32767压入栈中。

ldc

当int取值-2147483648~2147483647时,JVM采用ldc指令将常量压入栈中。
定义Test.java文件

 public static void main(String[] args) {
     int i = Integer.MAX_VALUE;
 }

查看class文件

 public static void main(java.lang.String[]);
 Code:
 0: ldc #2; //int 2147483647
 2: istore_1
 3: return
 }

可以看到上面代码第三行是采用ldc指令将2147483647常量压入栈中,需要注意的是ldc指令是从常量池中获取值的,也就是说在这段范围(-2147483648~2147483647)内的int值是存储在常量池中的。

如理解有误还望明白人不吝指出。

JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)的更多相关文章

  1. 003-整型入栈指令(iconst、bipush、sipush、ldc)

    一.概述 官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html参考地址:http://www.linmuxi.com/201 ...

  2. JVM 字节码之 int 入栈指令

    本文转载自JVM 字节码之 int 入栈指令(iconst.bipush.sipush.ldc) 前言 本文介绍 int 入栈指令 iconst.bipush.sipubh.Idc. 当 int 取值 ...

  3. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  4. Java finally语句到底是在return之前还是之后执行(JVM字节码分析及内部体系结构)?

    之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public ...

  5. JVM总结(五):JVM字节码执行引擎

    JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 ...

  6. JVM 字节码指令手册 - 查看 Java 字节码

    JVM 字节码指令手册 - 查看 Java 字节码 jdk 进行的编译生成的 .class 是 16 进制数据文件,不利于学习分析.通过下命令 javap -c Demo.class > Dem ...

  7. 从jvm字节码指令看i=i++和i=++i的区别

    1. 场景的产生 先来看下下面代码展示的两个场景 @Testvoid testIPP() { int i = 0; for (int j = 0; j < 10; j++) { i = i++; ...

  8. JVM 字节码执行实例分析

    前言 最近在看<Java 虚拟机规范>和<深入理解JVM虚拟机>,对于字节码的执行有了进一步的了解.字节码就像是汇编语言,是 JVM 的指令集.下面我们先对 JVM 执行引擎做 ...

  9. JVM字节码执行引擎和动态绑定原理

    1.执行引擎 所有Java虚拟机的执行引擎都是一致的: 输入的是字节码文件,处理过程就是解析过程,最后输出执行结果. 在整个过程不同的数据在不同的结构中进行处理. 2.栈帧 jvm进行方法调用和方法执 ...

随机推荐

  1. linux——基本配置

    环境:Ubuntu 12.04.2 LTS (GNU/Linux 3.5.0-23-generic i686) 网络配置 #临时改变 #修改IP和子网掩码 sudo ifconfig eth0 192 ...

  2. hashCode与equals的区别与联系

    一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一 ...

  3. 错误描述:请求“System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败

    错误描述:请求“System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, Pu ...

  4. CEF3开发者系列之CEF3入门

    CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开发的, ...

  5. Mybatis中的in查询和foreach标签

    Mybatis中的foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separato ...

  6. 初识 MySQL 5.6 新功能、参数

    摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...

  7. Django~static files

    such as images, JavaScript, or CSS https://docs.djangoproject.com/en/1.9/howto/static-files/ django. ...

  8. Effective C++ -----条款48:认识template元编程

    Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率. TMP可被用来生成“基于政策选择组合”(based on ...

  9. javascript 中 filter 方法

    filter 方法用来迭代一个数组,并且按给出的条件过滤出符合的元素. filter 方法传入一个回调函数,这个回调函数会携带一个参数,参数为当前迭代的项(我们叫它 val ). 回调函数返回 tru ...

  10. Windows update 失败的解决方案

    由于刚刚装了新的系统,结果在电脑用了刚刚一周之后,我打开了自动更新,结果电脑就一直处于更新状态中.期初我以为是更新比较慢,等等可能就结束了,结果等了足足一晚上,到了第二天,电脑显示是:配置更新失败,正 ...