返回顶部
首页 > 资讯 > 精选 >Java中的方法内联怎么用
  • 498
分享到

Java中的方法内联怎么用

2023-06-29 01:06:43 498人浏览 薄情痞子
摘要

这篇文章主要介绍“Java中的方法内联怎么用”,在日常操作中,相信很多人在Java中的方法内联怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的方法内联怎么用”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“Java中的方法内联怎么用”,在日常操作中,相信很多人在Java中的方法内联怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的方法内联怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    1. 什么是方法内联

    例如有下面的原始代码:

    static class B {    int value;    final int get() {        return value;    }}public void foo() {    y = b.get();    // ...do stuff...    z = b.get();    sum = y + z;}

    我们首先要进行的就是方法内联,主要有下面两个目的:

    去除方法调用的成本,如查找方法版本、建立栈帧。

    为其他优化建立良好基础。

    内联后代码如下:

    public void foo() {    y = b.value;    // ...do stuff...    z = b.value;    sum = y + z;}

    后续,还可以进行冗余访问消除、复写传播、无用代码消除等优化操作。

    2. 方法内联的重要性

    方法内联是编译器最重要的优化手段,如果没有内联,多数其他优化都无法有效进行。例如下面这个例子:

    public static void foo(Object obj){    if (obj != null) {        System.out.println("do something");    }}public static void testInline(String[] args) {    Object obj = null;    foo(obj);}

    testInline()方法里其实全都是无用的代码,但是如果不做方法内联,就无法发现任何 Dead Code 的存在,因为分开看的话两个方法里面的操作可能都有意义。

    3. Java中方法内联的困难

    JVM 中,只有非虚方法,也就是使用invokespecial指令调用的私有方法、实例构造器、父类方法和使用invokestatic指令调用的静态方法才会在编译器进行解析。

    而其他虚方法被invokevirtual指令调用,在调用时必须进行方法接收者的多态选择。对于一个虚方法,编译器静态地去做内联的时候很难确定应该使用哪个方法版本,这就造成了方法内联的困难。

    继承类型关系分析 CHA

    首先,JVM 引入了一种名为类型继承关系分析 CHA 的技术,这种技术用于在已加载的类中,确定某个接口是否有多于一种的实现、某个类是否存在子类、某个子类是否覆盖了父类的某个虚方法等信息。

    编译器在进行内联时会分不同情况采取不同处理:

    如果是非虚方法,那么就直接进行内联。

    如果是虚方法,那么向 CHA 查询是否有多个目标版本可供选择。

    如果只有一个版本,就直接内联,称为守护内联。但由于 Java 程序动态连接,不知道什么时候就会加载到新的类型而改变 CHA 的结论,所以要留好逃生门,假如程序后续执行中加载了导致继承关系发生变化的新类,那么必须抛弃已经编译的代码,退回到解释状态进行执行,或者重新编译。

    如果有多个版本可供选择,那即时编译器使用内联缓存来缩减方法调用的开销。内联缓存是一个建立在目标方法正常入口之前的缓存。在未发生方法调用时,内联缓存为空。第一次调用发生后,缓存记录下方法接收者的版本信息,并且在每次进行调用前都检查版本。

    如果每次调用的方法接收者版本是一样的,那称为单态内联缓存,通过缓存来调用,相比不内联只多了一次类型判断的开销。如果出现方法接收者不一致的情况,就退化为超多态内联缓存,开销相当于真正查找虚方法表来进行方法分派。当缓存未命中的时候,大多数JVM的实现时退化成超多态内联缓存,也有一些JVM选择重写单态内联缓存,就是更新缓存为新的版本。这样做的好处是以后还可能会命中,坏处是可能白白浪费一个写的开销。

    Java中的方法内联怎么用

    到此,关于“Java中的方法内联怎么用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Java中的方法内联怎么用

    本文链接: https://lsjlt.com/news/321709.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Java中的方法内联怎么用
      这篇文章主要介绍“Java中的方法内联怎么用”,在日常操作中,相信很多人在Java中的方法内联怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的方法内联怎么用”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-29
    • Java中的方法内联介绍
      目录1. 什么是方法内联2. 方法内联的重要性3. Java中方法内联的困难继承类型关系分析 CHA总结 1. 什么是方法内联 例如有下面的原始代码: static cla...
      99+
      2024-04-02
    • Go中的内联优化方法是什么
      本篇内容主要讲解“Go中的内联优化方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go中的内联优化方法是什么”吧!内联是什么?内联inlining就是把简短的函数在调用它的地方展开。在计...
      99+
      2023-06-16
    • C#中内联函数怎么用
      这篇文章将为大家详细讲解有关C#中内联函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C++ 中有个内联函数,使用 inline 来修饰函数,编译器就会对其进行优化,将此函数作为代码判断插入到调用...
      99+
      2023-06-29
    • Java中的main()方法怎么用
      这篇文章将为大家详细讲解有关Java中的main()方法怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java中的main()方法详解在Java中,main()方法是Java应用程序的入口方法,也就...
      99+
      2023-06-03
    • Java中的replaceAll()方法怎么用
      在Java中,replaceAll()方法用于替换字符串中匹配给定正则表达式的字符序列。该方法有两个参数,第一个参数是一个字符串表示...
      99+
      2023-10-27
      Java
    • C#中内联函数的用法介绍
      C++ 中有个内联函数,使用 inline 来修饰函数,编译器就会对其进行优化,将此函数作为代码判断插入到调用处。 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还...
      99+
      2024-04-02
    • Java 中的 load 方法与编程算法的联系是什么?
      在 Java 编程中,load 方法是一个非常常见的方法。它可以帮助我们在运行时加载类或资源文件,使得程序的灵活性大大提高。同时,与编程算法的联系也是十分密切的。本文将深入探讨 Java 中的 load 方法和编程算法的关系,并通过代码演...
      99+
      2023-10-15
      load spring 编程算法
    • Java中的递归方法怎么用
      小编给大家分享一下Java中的递归方法怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!递归方法定义本身调用方法本身的现象叫做递归在这之前我们学的东西:例如St...
      99+
      2023-06-22
    • Java中的clone方法怎么使用
      在Java中,`clone()`方法是用来创建对象的一个浅拷贝副本。要使用`clone()`方法,需要遵循以下步骤:1. 首先,在要...
      99+
      2023-09-15
      Java
    • java中string的方法怎么应用
      在Java中,String类是一个常用的类,提供了许多可以对字符串进行操作的方法。下面是一些常见的String方法及其应用:1. l...
      99+
      2023-09-23
      java
    • Java中的equalsIgnoreCase()方法怎么使用
      equalsIgnoreCase()方法是用来比较两个字符串是否相等,不区分大小写。使用方法如下:```javaString str...
      99+
      2023-09-12
      Java
    • java中的indexOf()方法怎么使用
      在Java中,indexOf()方法用于查找指定字符或字符串在字符串中第一次出现的位置。它的语法如下:```javapublic i...
      99+
      2023-09-14
      java
    • Java中Object类的方法怎么用
      这篇文章主要介绍了Java中Object类的方法怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中Object类的方法怎么用文章都会有所收获,下面我们一起来看看吧。前言:Java的Object 类的...
      99+
      2023-06-30
    • java中的tostring方法怎么使用
      在Java中,toString()方法是Object类的一个方法,可以用于将一个对象转换成字符串表示形式。通常情况下,toStrin...
      99+
      2023-08-16
      java tostring
    • java中的close方法怎么使用
      在Java中,close方法通常用于关闭资源,如文件、网络连接、数据库连接等。关闭资源是为了释放资源,防止资源泄露和系统性能问题。 ...
      99+
      2024-03-01
      java
    • java中的matches方法怎么使用
      在Java中,matches方法是用于检查字符串是否匹配指定的正则表达式的方法。它的用法如下: String str = "...
      99+
      2024-03-02
      java
    • Java中split()方法怎么用
      Java中split()方法怎么用Java中split主要用于分隔字符串。具体分析如下: 如果用“.”作为分隔的话,必须是如下写法,String.split("."),这样才能正确的分隔开,不能用String.split(".")。如果用“...
      99+
      2014-10-27
      java教程 java spilt 用法
    • Java中hashCode方法怎么用
      这篇文章主要介绍“Java中hashCode方法怎么用”,在日常操作中,相信很多人在Java中hashCode方法怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中hashCode方法怎么用”的疑...
      99+
      2023-06-29
    • Java中Math.round()方法怎么用
      在Java中,Math.round()方法用于将一个浮点数四舍五入为最接近的整数。该方法有两种重载形式:1. Math.round(...
      99+
      2023-09-12
      Java
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作