java ldc指令_6.Java JVM_4.JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
本篇主要分享下在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文件
1 public static void main(String[] args) {
2 int i = 5;
3 int j = -1;
4 }
查看class文件
1 public static void main(java.lang.String[]);
2 Code:
3 0: iconst_5
4 1: istore_1
5 2: iconst_m1
6 3: istore_2
7 4: return
8 }
分析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文件
1 public static void main(String[] args) {
2 int i = 127;
3 }
查看class文件
1 public static void main(java.lang.String[]);
2 Code:
3 0: bipush 127
4 2: istore_1
5 3: return
6 }
可以看到上面代码第三行是采用bipush指令将常量127压入栈中。
sipush
当int取值-32768~32767时,JVM采用sipush指令将常量压入栈中。
定义Test.java文件
1 public static void main(String[] args) {
2 int i = 32767;
3 }
查看class文件
1 public static void main(java.lang.String[]);
2 Code:
3 0: sipush 32767
4 3: istore_1
5 4: return
6 }
可以看到上面代码第三行是采用sipush指令将常量32767压入栈中。
ldc
当int取值-2147483648~2147483647时,JVM采用ldc指令将常量压入栈中。
定义Test.java文件
1 public static void main(String[] args) {
2 int i = Integer.MAX_VALUE;
3 }
查看class文件
1 public static void main(java.lang.String[]);
2 Code:
3 0: ldc #2; //int 2147483647
4 2: istore_1
5 3: return
6 }
可以看到上面代码第三行是采用ldc指令将2147483647常量压入栈中,需要注意的是ldc指令是从常量池中获取值的,也就是说在这段范围(-2147483648~2147483647)内的int值是存储在常量池中的。
如理解有误还望明白人不吝指出。
java ldc指令_6.Java JVM_4.JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)相关推荐
- JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html 原文地址:http://www.linmuxi.com/2016/02 ...
- JVM字节码之整型iconst、istore、iload指令
局部变量表 局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量. 一个局部变量可以保存一个类型为boolean.byte.char.sh ...
- Java指令全集_Java的JVM字节码指令集详解
本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...
- java sipush_003-整型入栈指令(iconst、bipush、sipush、ldc)
一.概述 二.前言 当int类型 取值-1~5采用iconst指令 取值-128~127采用bipush指令 取值-32768~32767采用sipush指令 取值-2147483648~214748 ...
- Java生产环境下性能监控与调优详解 第8章 JVM字节码与Java代码层调优
第8章 JVM字节码与Java代码层调优 8-1 jvm字节码指令-1 8-2 jvm字节码指令-2 8-3 i++与++i 8-4 字符串+拼接 8-5 Try-Finally字节码 8-6 Str ...
- 【JVM · 字节码】指令集 解析说明
1. 概述 Java字节码指令对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令. Java虚拟机的指令由 一个字节长度 的.代表着某种特定操作含义的数字(称为 操作码/Opcode)以及跟随其后 ...
- [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...
- 【深入理解java虚拟机】 - JVM字节码指令介绍
文章目录 什么是字节码指令 javap的用法 字节码与数据类型 字节码指令集 加载和存储指令 运算指令 类型转换指令 对象创建与访问指令 操作数栈管理指令 控制转移指令 方法调用和返回指令 异常处理指 ...
- Java的Class类文件结构及基本字节码指令
Class类文件的结构 概念:Class文件是一组以8位字节为基础单位的二进制流 按顺序整齐排列 没有任何分隔符,内容全部是运行时的必要数据,没有空隙存在 排序方式:高位在前 Big-Endian:最 ...
- java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码
有了前面一系列的铺垫和准备后,我们终于能走到至关重要的一刻.在本节,我们将用C语言开发快速排序算法,然后利用我们的编译器把它编译成java字节码,让C语言编写的快速排序算法能在java虚拟机上顺利执行 ...
最新文章
- Java开发需掌握的常用Linux命令(持续更新)
- ReadDirectoryChangesW监控目录文件操作
- 系统架构设计师考试知识点整理-2:进程的状态-三态模型和五态模型
- 离散数学反对称关系_《离散数学》学习记录 - 集合论
- WINFORM應用程式的主進入點和清除資源
- java输出值_java参数传递(超经典)(强烈建议自己先写出程序的输出值)
- Perforce的环境变量配置
- ReentrantLock1.8源码
- 企业云存储 | 为什么越来越多的NAS用户转向企业云盘?
- html克隆元素增加id,h.js - 元素克隆与追加
- 虚幻airsim1:下载安装
- 回顾备忘—Android系统hal层相关系统粗概
- IEEE Conference Template Letter
- python怎么读取excel数据-python怎么从excel中读取数据?
- vs2008配置opencv2.4.0
- L298N模块的连接与使用(stm32驱动与51驱动)
- html和css学习课件(新版)
- HorNet+YOLOv5改进方案
- matlab中删除矩阵中的某些行
- 编译ijkplayer遇到的问题“/libavutil/arm/asm.S:50:9: error: unknown directive”的解决
热门文章
- php判断是否是全英文,php判断字符串是否全英文,纯中文,中英文组合的方法
- 阿里P8级大佬详解并发编程里的设计模式之Guarded Suspension
- 熊孩子说“你没看过奥特曼”,赶紧用Python学习一下,没想到
- 同花顺股票交易接口测试
- 【华为云】 搭建TFP站点心得体会
- 《平凡的世界》文摘----少安写给她妹妹的那封信...
- php中exec的用法,php exec用法详解
- js根据url下载文件并重命名,兼容ie11(其他版本未测试)
- 双显示器如何调节亮度
- php工程师的学习之道以及需要掌握的知识体系