【JDK源码阅读】什么是 avoid getfield opcode ?

说明:JDK源码版本为 Oracle JDK 8

1. 背景

阅读 java.lang.String 的源码,会发现有些地方注释为/* avoid getfield opcode */,此处的代码是将当前类定义的成员变量引用为本地变量,从字面意思理解,是为了避免使用 getfield 操作码,那什么是getfield呢?
在这里插入图片描述

2. 实践

《深入理解java虚拟机》这本书中有解释,getfield获取指定类的实例域,并将其值压入栈顶,那么是否意味着每次获取成员变量,都会做一次getfield操作呢?带着这个疑问,我们写代码验证一下。
创建一个GetField类,添加代码如下

public class GetFieldTest {
    int[] arr = new int[10];
    public static void main(String[] args) {
        GetFieldTest th = new GetFieldTest();
        th.testArr();
    }

    void testArr() {
        arr[0] = 1;
        arr[1] = 2;
        System.out.println(arr.length);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
    }
}

javac命令编译类,并用java命令运行代码结果:
在这里插入图片描述
然后用javap -c命令反汇编GetField.javaclass文件:
在这里插入图片描述
可以看到,testArr方法中总共出现了5次getfield操作码,分别对应每次使用到arr的行。那么,将arr引用为方法中的本地变量呢?
修改代码如下:

public class GetFieldTest {
    int[] arr = new int[10];
    public static void main(String[] args) {
        GetFieldTest th = new GetFieldTest();
        th.testArr();
    }

    void testArr() {
        int[] arr1 = arr;
        arr1[0] = 1;
        arr1[1] = 2;
        System.out.println(arr1.length);
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
    }
}

同样反汇编查看getfield的次数,发现只有一次了:
在这里插入图片描述
看来,在方法中频繁使用成员变量时,将其引用为本地变量确实可以减少getfield操作的次数,也就达到了avoid getfield opcode的效果,这样也可以提升性能。

参考

[1] CSDN: String源码中的“avoid getfield opcode”是什么意思

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/178293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础知识——字,字节,进制,short,byte等

目录 进制位,字节,字Byte,ShortByteBuf有符号数和无符号数 进制 HEX,Hexadecimal ,十六进制。 DEC,Decimal ,十进制。 OCT,Octal ,八进制。 BIN,Binary &a…

基于java和uniapp的即时聊天源码

聊天IM,支持单聊、群聊、朋友圈、摇一摇、附近的人、收藏、扫码、机器人、文字、图片、名片、实时音视频通话等功能。用uniapp开发,支持打包成多终端! 推送:uniPush websocket资源:阿里OSS(图片、声音、视…

JMeter —— 接口自动化测试(数据驱动)

前言 之前我们的用例数据都是配置在HTTP请求中,每次需要增加,修改用例都需要打开JMeter重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢?我们可以将用例的数据存…

vxe编辑保存表格

业务需求: 1、需要点击编辑时,全部表格显示编辑框,点击保存,全部保存。 2、因为位置问题,产品经理把24小时分成了两行,开发就得分两个表格。列标题是写死的,文字偏移也是写死的,其他…

Linux设置静态IP

Linux设置静态IP 使用ip addr查看ip,如下所示就是动态IP 1、什么是静态IP? 静态ip就是固定的ip,需要手动设置。静态IP地址(又称固定IP地址)是长期分配给一台计算机或网络设备使用的 IP 地址。一般来说,一…

电商平台API接口的作用到底是什么?重要性又是什么?具体接入方式?

电商平台API接口的重要性及其作用主要体现在以下几个方面: 数据支持:电商平台拥有大量的商品信息、用户信息、交易信息等大数据资产,而API接口提供访问这些数据的途径,使得其他软件、应用、网站等可以利用这些数据提供更丰富的功…

【三维几何学习】自制简单的网格可视化软件 — Mesh Visualization

自制简单的网格可视化软件 — Mesh Visualization 引言一、整体框架1.1 三角形网格1.2 界面管理1.3 VTK可视化界面 二、核心源码2.1 三角形网格:TriMesh类2.2 界面Widget_Mesh_Manager2.3 VTK可视化2.4 main 引言 使用PyQt自制简单的网格可视化软件 - 视频展示 本是…

Echarts实现散点图

效果图如下&#xff1a; <html><head><meta charsetutf-8><link rel"stylesheet" href"js/leaflet1.7.1/dist/leaflet.css"/><script src"js/leaflet1.7.1/dist/leaflet.js"></script><script src"…

win10 eclipse安装教程

前言&#xff1a;安装eclipse之前必须安装JDK&#xff0c;JDK是编译环境&#xff0c;eclipse是集成开发平台。 一、JDK的安装 Java Development Kit 简称 JDK (一). 官方下载地址&#xff1a; Java Archive Downloads - Java SE 8u211 and later (oracle.com) 找到&#xf…

用Stable Diffusion帮助进行卡通风格渲染

用Stable Diffusion帮助进行卡通风格渲染 正常风格渲染卡通风格贴图增加涅斐尔边缘高光效果 正常风格渲染 正常的动物写实模型 卡通风格贴图 用Stable Diffusion可以帮助我们将写实贴图转化为卡通风格&#xff08;具体参数可以自己调试&#xff0c;总体上是将提示词强度和图…

《QT从基础到进阶·三十八》QWidget实现炫酷log日志打印界面

QWidget实现了log日志的打印功能&#xff0c;不仅可以在界面显示&#xff0c;还可以生成打印日志。先来看下效果&#xff0c;源码放在文章末尾&#xff1a; LogPlugin插件类管理log所有功能&#xff0c;它可以获取Log界面并能打印正常信息&#xff0c;警告信息和错误信息&…

【101011011序列检测_2023.11.20】

源文件 tb文件in输入&#xff1a;01010‘1011011’0 VCS仿真结果 当next_state为s9时&#xff0c;out置为1

软考中级哪个科目最简单?

那必须是系统集成项目管理工程师&#xff01; 系统集成项目管理工程师考试内容少&#xff0c;题型简&#xff0c;报考门槛低&#xff0c;零基础就能报考&#xff0c;学习内容比较简单&#xff0c;接近工作和生活。 系统集成项目管理工程师证书是中国计算机技术职业资格&#…

【React-Router】嵌套路由

1. 嵌套路由 在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由。 2. 嵌套路由配置 // /page/About/index.js const About () > {return (<div>二级路由 About 组件</div>) }export default About// /page/Layout/index.js import { Outlet, …

Ajax技

Ajax的特点 异步提交&#xff1a;Ajax采用异步通信方式&#xff0c;能够在页面无需重新加载的情况下向服务器发送请求并接收响应数据&#xff0c;提升了用户体验。无需插件&#xff1a;Ajax是基于标准浏览器的Javascript和XMLHttpRequest对象实现的&#xff0c;无需安装插件或…

【kubernetes】k8s架构之节点

文章目录 1、集群架构示意图2、概述3、管理3.1 节点名称唯一性3.2 节点自注册3.3 手动节点管理 4、节点状态4.1 地址&#xff08;Addresses&#xff09;4.2 状况&#xff08;Condition&#xff09;4.3 容量&#xff08;Capacity&#xff09;与可分配&#xff08;Allocatable&am…

关于一些bug的解决1、el-input的输入无效2、搜索之后发现数据不对3、el多选框、单选框点击无用4、

el-input输入无效 原来的代码是 var test null 但是我发现不能输入任何值 反倒修改test的初始值为123是可以的 于是我确定绑定没问题 就是修改的问题 于是改成 var test ref&#xff08;&#xff09; v-model绑定的值改成test.value就可以了 因为ref是相应式的 可以通过输入…

minio安装使用-linux

下载地址&#xff1a;MinIO | Code and downloads to create high performance object storage 选择 minio server 可以直接下载二进制文件。 将下载的文件传输到服务器的指定文件夹下&#xff0c;如 /opt/minio。 然后在&#xff0c;命令行启动minio&#xff1a; /opt/mini…

Nginx高级

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…