今天看到一个很有意思的提问:(a+b)*10,10是存放在哪里的?是常量池么?如果是常量池,在进行运算的时候,是通过指针来找到的吧?
某回答:10是在常量池,常量池在jdk1.8以后已经移到元空间了。
要验证这个答案是否正确其实很简单,写一个测试方法通过javap查看编译后的字节码指令就能得出结论。
测试方法源码如下:
- private int m(int a, int b) {
- int r = a * b * 10;
- return r;
- }
使用javap查看编译后的字节码如下:
- private int m(int, int);
- descriptor: (II)I
- flags: ACC_PRIVATE
- Code:
- stack=2, locals=4, args_size=3
- 0: iload_1
- 1: iload_2
- 2: imul
- 3: bipush 10
- 5: imul
- 6: istore_3
- 7: iload_3
- 8: ireturn
笔者翻阅了一下JVM字节码指令表,相关指令如下图所示。
字节码指令由操作码和零个或多个操作数组成,编译后会被写入方法的Code属性中,操作数要么是立即数,要么是指向class文件结构常量池中常量的索引,要么是跳转目标指令的偏移量。
设立即数10为x,可得出以下结论:
当x取值在区间[-1,5]时,x直接被编译进方法的code属性中,作为iconst指令的操作数;
当x取值在区间[-128,127]时,x也直接被编译进方法的code属性中,作为bipush指令的操作数,取值范围[-128,127]是因为bipush指令的操作数只能是一个字节;
当x取值在区间[-32768,32767]时,x也直接被编译进方法的code属性中,作为sipush指令的操作数,取值范围[-32768,32767]是因为sipush指令的操作数有两个字节;
否则才会将x编译进class的常量池,在进行运算时通过ldc指令从常量池(元空间)push进操作数栈中。
本文转载自微信公众号「Java艺术」,可以通过以下二维码关注。转载本文请联系Java艺术公众号。
云产品 IoT企业实例 是连接 IoT设备和云上业务系统的核心云产品 解决海量设备连...
背景IT系统演进 为了更好的适应商业模式的快速演进 IT核心能力 包括开发模式、系...
操作场景 本节为您介绍通过控制台提供的CloudShell登录云服务器的操作步骤。 登...
作者 | 亮言 来源 | 阿里技术公众号 一 背景 订单状态流转是交易系统的最为核心...
1.是时候买张去天庭的机票好好和月老谈谈了。 2.出过轨的男人就像掉在屎上的钱...
本文基于WLNMP一键安装包安装禅道12.4 当前系统及应用版本:Centos7.x、nginx、p...
随着互联网的快速发展 企业上云乃是大势所趋。2020年突如其来的这场疫情 给人们...
欢迎大家加入云开发技术图谱活动 以下是打卡指南 开始打卡前请务必认真阅读 活动...
本文转载自微信公众号「咸鱼正翻身」,作者MDove。转载本文请联系咸鱼正翻身公众...
【51CTO.com快译】我之前解释了如何借助谷歌语音识别API,使用Speech Recognitio...