(a+b)*10,10是存在哪里的?是常量池么?

原创 吴就业 113 0 2021-03-11

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/79dd9aac1e75433fa607e3dd9325b661

作者:吴就业
链接:https://wujiuye.com/article/79dd9aac1e75433fa607e3dd9325b661
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

(a+b)*10,10是存在哪里的?是常量池么?

本篇文章写于2021年03月11日,从公众号|掘金|CSDN手工同步过来(博客搬家),本篇为原创文章。

今天看到一个很有意思的提问:(a+b)*1010是存放在哪里的?是常量池么?如果是常量池,在进行运算的时候,是通过指针来找到的吧?

某回答: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字节码指令表,相关指令如下图所示。

截屏2021-03-11 10.42.46.png

字节码指令由操作码和零个或多个操作数组成,编译后会被写入方法的Code属性中,操作数要么是立即数,要么是指向class文件结构常量池中常量的索引,要么是跳转目标指令的偏移量。

设立即数10x,可得出以下结论:

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

如何写出健壮的业务代码

我们一开始总会自信的觉得自己写出来的代码是个美女,只是写着写着越来越胖,最终写成了个200斤的胖子,自己见了都嫌弃……

在网关实现合并多个微服务Swagger接口文档的详细步骤

由于微服务的划分,使用Swagger生成的接口文档也随之拆散,前端同事不得不把每个微服务的接口文档保存为浏览器标签,方便快速切换。在引入网关之后我们想改善这个问题,统一多个微服务接口文档的入口,最好不需要将每个微服务暴露到外网,能够统一配置是否开启接口文档功能,也不需要为接口文档配置路由规则。

多人协作如何管理Git分支

关于Git分支管理,每个团队在不同阶段都有自己的管理策略,最近我们团队也争论过这个问题。

通过Linux系统调用实现文件拷贝命令深入理解Java文件读写的底层实现(含MappedByteBuffer)

继 《Java文件的简单读写、随机读写、NIO读写与使用MappedByteBuffer读写》,本篇通过调用Linux OS文件操作系统函数实现copy命令以加深我们对Java文件读写底层实现的理解。

实现分布式共识算法-Raft算法

笔者开源了自己实现的Java版Raft算法框架raft-core。

一种基于签名算法且简单安全的API授权机制,微信也在用

今天介绍的API授权机制或许也是使用较为广泛的一种API接口授权机制,记得笔者以前做微信支付功能的时候,微信提供的支付接口也使用这种方式:签名。