深入理解JVM后端优化技术-方法内联

news2024/11/24 2:22:55

       相关系列

深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客

深入理解JVM后端优化技术-锁消除(Lock Elision)-CSDN博客

深入理解JVM后端优化技术-锁粗化(Lock Coarsening)-CSDN博客

 jvm只是负责依次将字节码指令逐次转换成机器码。而在转换过程中,JVM会对做一些代码优化,不管怎么样,就算程序员写出了很烂的代码,JVM也能保持一个不错的执行效率。这就是编绎优化

方法内联定义

        方法内联就是把被调用方的方法代码复制到调用方的方法中,避免真实的方法调用。这样可以频繁的减少创建栈帧。

示例1

代码

下面是示例代码:

package com.dzend.mall.order;

public class InLineDemo {

    private int add(int x1,int x2,int x3,int x4){
        return add2(x1,x2) + add2(x3,x4);
    }
    //内联优化
    private int add2(int x1,int x2){
        return x1+x2;
    }

    public static void main(String[] args) {
        InLineDemo inLineDemo = new InLineDemo();
        //超过⽅法调⽤计数器的阈值 100000 次,才会进⼊ JIT 实时编译,进⾏内联优化。
        for(int i=0;i<100000;i++) {
            inLineDemo.add(1, 2, 3, 4);
        }
    }
    
}

jvm参数设置

设置JVM参数:

-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions

执行过后可以看到

这个成为热点代码必须要达到JVM设置的阈值。当没有达到设置的阈值时,就不会看到方法内联了。

  方法内联除了把目标方法的代码“复制”到发起调用的方法中,避免了真实的方法调用。然而,JVM方法内联过程没有这么简单。而且,方法内联还有更多的后续优化手段。

示例二

代码

看下面代码:

package com.dzend.mall.order;

public class InLineDemo {

    private static void one(Object obj){
        if(obj !=null){
            System.out.printf("do something");
        }
    }
    //内联优化,会把无用代码消除
    private static void two(){
       Object obj = null;
       one(obj);
    }

    public static void main(String[] args) {
        Long startTime = System.currentTimeMillis();
        
        for(int i=0;i<1000000;i++) {
            two();
        }
        System.out.println(">>>>>>>>"+(System.currentTimeMillis()-l));
    }

}

代码分析

one和two是独立的二个方法,但是将one方法内联到two方法后,就可以把这个无用的死代码"Dead Code“。然后,JVM虚假机就可以进行dead code elimination死代码抹除的优化。

JDK8中JVM关于方法内联的参数

-XX:+Inline 启用方法内联。默认开启。

-XX:InlineSallCode=size 用来判断是否需要对方进行内联优化。如果一个方法编绎后的字节码大小于这个值,就无进行内联。默认值是1000bytes。

-XX:MaxInlineSize=size 设定内联方法的最大字节数。如果一个方法编绎后的字节码大于这个值,则无法进行内联。默认值是325bytes。

-XX:FreqInlieSize=size 设定热点方法进行内联的最大字节数。如果一个热点方法编绎后的字节大于这个值,则无法进行内联。默认值为325bytes

-XX:MaxTrivialSize=size 设定要进行内联的琐碎方法的最大字节数(Trivial Method:通常指那些只包含一两行语句,并且逻辑非常简单的方法。默认为6bytes.

-XX:+PrintInlining 打印内联决策,通过这个指令可以看到哪些方法进行了内联。默认是关闭的。另外,这个参数要配合-XX:+UnlockDiagnosticVMPOptions参数使用。

方法内联与编写代码技巧

比上面的相关参数不难分析出,编写代码的时候可以通过一些方法提升方法内联发生的概率。

1、在编程中,尽量多写小方法,避免写大方法。方法太大不光会导致方法无法内联。加外,成为热点代码后,还会占用更多的CodeCache。

2、在内存不紧张的情况下,可以通过调整JVM参数,减少热点阈值或增加方法体阈值,让更多的方法进行内联。

3、尽量使用final,private,static关键字修饰方法。该当如果需要继承(使用Invokevirtual指令调用) ,那具体调用 的方法,就只能在运行到这一行代码时才能确定,编绎器很难在编绎时得出绝对正确的结论,也就加大了编译执行的难度。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能电表(AMI):革新电力行业的利器

近年来&#xff0c;随着电力行业的不断发展和科技的进步&#xff0c;智能电表&#xff08;AMI&#xff09;作为一种新型的电能测量设备&#xff0c;逐渐引起了人们的关注。AMI不仅具有传统电表的计量功能&#xff0c;还具备远程通信、数据采集、实时监测和多种数据分析等多功能…

(3)(3.1) 英特尔Realsense深度摄像头(二)

文章目录 前言 5 配置ArduPilot 6 地面测试&#xff1a;飞行前验证 7 飞行测试 8 实验 9 数据闪存记录 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在…

Linux(CentOS7)部署 y-api 接口管理平台

目录 前言 前置环境 mongodb node 安装 y-api 部署页面 启动 y-api 基本使用教程 前言 前后端分离时代&#xff0c;前后端通过接口文档来协作开发项目。一般开发过程中&#xff0c;由后端先编写接口文档&#xff0c;然后交付给前端&#xff0c;这时候前后端都根据这个…

Linux/Lame

Lame 今天随便乱逛发现这台机器貌似是 HackTheBox 平台的第一台机器&#xff0c;而且我还没做过&#xff0c;从简介上来看的话是一台很简单的机器&#xff0c;快快的玩一下 Enumeration nmap 首先用 nmap 扫描一下常见的端口&#xff0c;发现系统对外开放了 21,22,139,445 端…

如何在CentOS安装Nexus容器无公网IP远程管理本地仓库

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

免费专利下载网站(亲测有效!无需注册登录)

1.中国专利全文下载 本数据库收录了自1985年以来的全部中国专利数据摘要及全文&#xff0c;包括中国专利申请公开说明书、授权公告说明书&#xff0c;涵盖全部发明专利、实用新型专利、外观设计专利。药物在线已开发中国专利全文下载极速版!支持专利全文在线浏览&#xff0c;专…

Django交易商场

Hello&#xff0c;我是小恒不会java 最近学习django&#xff0c;写了一个demo,学到了不少东西。 我在GitHub上开源了&#xff0c;提示‘自行查看代码&#xff0c;维护&#xff0c;运行’。 最近有事&#xff0c;先发布代码了&#xff0c;我就随缘维护更新吧 介绍&#xff1a; 定…

计算机的发展趋势

本文 我们来说计算机的发展趋势 目前来讲 计算机是朝着 巨型化 微型化 网络化 智能化发展 巨型化 指功能巨型化 是指其高速运算、大存储容量和强功能的巨型计算机。其运算能力一般在每秒百亿次以上、内存容量在几百兆字节以上。 主要用于航空航天、军事、气象、人工智能、生…

FME学习之旅---day21

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;AutoCAD 变换 相关的文章 为您的 DWG 赋予一些样式&#xff1a;使用 DWGStyler、模板文件、块等 FME数据检查器在显示行的方式上受到限制。它只能显示线条颜色&#xff0c;而…

Linux锁的使用

一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

雷达学习之多普勒频率

一、多普勒频率如何产生&#xff1f; 雷达的原理是发射一些无线电脉冲来探测目标&#xff0c;并通过回波的延时来计算目标与雷达的距离&#xff0c;但当目标为运动物体时&#xff0c;在回波向目标传输的同时&#xff0c;目标也会远离或接近回波&#xff0c;所以会导致回波信号…

CDN加速原理那些事

名词解释 CNAME记录&#xff08;CNAME record&#xff09; CNAME即别名( Canonical Name )&#xff1b;可以用来把一个域名解析到另一个域名&#xff0c;当 DNS 系统在查询 CNAME 左面的名称的时候&#xff0c;都会转向 CNAME 右面的名称再进行查询&#xff0c;一直追踪到最后…

vue 中使 date/time/datetime 类型的 input 支持 placeholder 方法

一般在开发时&#xff0c;设置了 date/time/datetime 等类型的 input 属性 placeholder 提示文本时&#xff0c; 发现实际展示中却并不生效&#xff0c;如图&#xff1a; 处理后效果如图&#xff1a; 处理逻辑 判断表单项未设置值时&#xff0c;则设置其伪类样式&#xff0c;文…

Pillow教程11:九宫格切图的实现方法(安排!!!)

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

ctf_show笔记篇(web入门---SSTI)

前言 模板引擎 模板引擎是为了让用户界面以及业务数据分离开才产生的&#xff0c;模板引擎会生成特定的文档&#xff0c;然后通过模板引擎生成前端html代码&#xff0c;然后再获取用户数据再放到渲染函数里渲染&#xff0c;最后将生成的html代码个渲染好的数据结合拿给浏览器呈…

【Git教程】(十)版本库之间的依赖 —— 项目与子模块之间的依赖、与子树之间的依赖 ~

Git教程 版本库之间的依赖 1️⃣ 与子模块之间的依赖2️⃣ 与子树之间的依赖&#x1f33e; 总结 在 Git 中&#xff0c;版本库是发行单位&#xff0c;代表的是一个版本&#xff0c;而分支或标签则只能被创建在版本库这个整体中。如果一个项目中包含了若干个子项目&#xff0c;…

学习赚钱两不误--全自动挂机软件(网心云)

1、简介 程序员的工作环境程序员的工作环境最多的就是网络资源&#xff0c;所以我们工作中有很多的闲置网络资源&#xff0c;不白嫖有点浪费哈。下面就给大家介绍一下免费分享上行带宽赚钱的平台--网心云 优点&#xff1a; &#xff08;1&#xff09;平台大、靠谱、稳定 &a…

四川易点慧电子商务抖音小店可靠购物

在当下这个信息爆炸的时代&#xff0c;电子商务的崛起不仅改变了人们的购物习惯&#xff0c;也催生了众多新兴的电商平台。四川易点慧电子商务抖音小店便是其中的佼佼者&#xff0c;以其独特的魅力和可靠性&#xff0c;赢得了广大消费者的青睐。 一、平台背景实力雄厚 四川易点…

3、最大池化maxinmum pooling

了解有关最大池化特征提取的更多信息。 简介 在第二课中,我们开始讨论卷积神经网络(convnet)的基础如何进行特征提取。我们了解了这个过程中的前两个操作是在带有 relu 激活的 Conv2D 层中进行的。 在这一课中,我们将看一下这个序列中的第三个(也是最后一个)操作:通过…

(一)基于IDEA的JAVA基础12

一维数组 为什么使用数组: 当我们需要存储一系列数据的时候&#xff0c;就需要用到数组&#xff0c;如果不使用数组&#xff0c;我们就要需要一个一个的去声明变量&#xff0c;这样浪费内存空间&#xff0c;同时效率低下。 什么是数组: 数组本身就是一个变量&#xff0c;只…