[转帖]方法内联

方法,内联 · 浏览次数 : 0

小编点评

**方法内联** **定义:** 方法内联指的是在即时编译过程中直接编译目标方法的方法体,并替换原方法调用。 **要点:** * 方法内联是一种即时编译期的优化技术。 * 目标IR图的接收参数节点要与调用者IR图的传参节点相连。 * 融合后的IR图还有优化的空间。 **规则:** * 触发方法内联的规则自动拆箱总被内联。 * 不触发方法内联的规则不能被其他类中的方法内联。 * 目标方法所在的类未被初始化。 **性能影响:** * 方法内联的效率越高,编译时间越长,峰值性能的到达时间越晚。 **其他影响因素:** * 目标方法的调用次数及大小。 * 目标方法所在的类热度。 * 目标方法是native方法。

正文

https://www.jianshu.com/p/22d2cac9c512

 

一、方法内联

方法内联指的是在即时编译过程中遇到方法调用时,直接编译目标方法的方法体,并替换原方法调用。
注:

  • 方法内联属于即时编译期的优化技术;
  • 即时编译的过程是字节码被解析成IR图,优化IR图,再由优化过的IR图生成机器码的过程;
  • 解析指的是即时编译器对字节码做的动作,是字节码到IR图的转换;

二、方法内联要点

内联也可以表述成2个IR图的融合,在该过程中,有一些要点值得注意。

  • 目标IR图的接收参数节点要和调用者IR图的传参节点相连;
  • 所有指向调用者IR图调用节点的边要重新指向目标IR图返回值节点,如果目标IR图有多个返回值节点,则生成一个聚合节点;
  • 目标IR图抛异常的路径要和调用者IR图的异常处理路径相连;
  • 融合后的IR图还有优化的空间;

三、方法内联的规则

内联越多,生成代码的效率越高,编译时间越长,峰值性能的到达时间越晚;内联越多,机器码越长,当超过阈值(-XX:ReservedCodeCacheSize),即时编译将关闭。触发和不触发方法内联遵从一定的规则。
触发方法内联的规则

  • 自动拆箱总被内联;
  • -XX:CompileCommand中的inline指令指定的方法;
  • @ForceInline注解的方法;

不触发方法内联的规则

  • Throwable类的方法不能被其他类中的方法内联;
  • -XX:CompileCommand中dotinline或exclude指令指定的方法;
  • @Dontinline注解的方法;
  • 调用字节码对应的符号引用未被解析;
  • 目标方法所在的类未被初始化;
  • 目标方法是native方法;
  • C2不支持内联超过9层的调用(-XX:MaxInlineLevel),以及1层的直接递归调用(-XX:MaxRecursIninleLevel)

其他影响是否方法内联的因素

  • 方法调用指令所在程序的热度;
  • 目标方法的调用次数及大小;
  • 当前IR图的大小;

总结
即时编译器中的内联算法更青睐于小的方法。

与[转帖]方法内联相似的内容:

[转帖]方法内联

https://www.jianshu.com/p/22d2cac9c512 一、方法内联 方法内联指的是在即时编译过程中遇到方法调用时,直接编译目标方法的方法体,并替换原方法调用。注: 方法内联属于即时编译期的优化技术; 即时编译的过程是字节码被解析成IR图,优化IR图,再由优化过的IR图生成机器

[转帖]什么是方法内联

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 方法内联是指,在编译过程中,当遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用

[转帖]JVM系列之:深入学习方法内联

在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 以 getter/s

[转帖]JVM系列之:深入学习方法内联

https://zhuanlan.zhihu.com/p/487044559 在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方

[转帖]JVM系列之:关于逃逸分析的学习

本文为《深入学习 JVM 系列》第十九篇文章 上文讲解完方法内联后,JIT 即时编译还有一个最前沿的优化技术:逃逸分析(Escape Analysis) 。废话少说,我们直接步入正题吧。 逃逸分析 首先我们需要知道,逃逸分析并不是直接的优化手段,而是通过动态分析对象的作用域,为其它优化手段提供依据的

[转帖]Redis 运维实战 第05期:RDB 持久化

https://cloud.tencent.com/developer/article/1986826 前面一节,我们聊了 AOF,AOF 有个不足点就是:进行数据恢复时,需要逐一把日志都执行一遍,非常耗时间。 Redis 还有另外一种持久化方法:内存快照。指内存中的数据在某一时刻的状态记录,这个快

[转帖]17 种查看 Linux 物理内存的方法

17 种查看 Linux 物理内存的方法 https://linux.cn/article-10235-1.html 大多数系统管理员在遇到性能问题时会检查 CPU 和内存利用率。Linux 中有许多实用程序可以用于检查物理内存。这些命令有助于我们检查系统中存在的物理内存,还允许用户检查各种方面的内

[转帖]Linux下清理内存和Cache方法见下文:

https://www.cnblogs.com/the-tops/p/8798630.html 暂时目前的环境处理方法比较简单: 在root用户下添加计划任务: */10 * * * * sync;echo 3 > /proc/sys/vm/drop_caches; 每十分钟执行一次,先将脏数据写回

[转帖]解析Linux gcore: 揭示程序内存捕获的秘密(linuxgcore)

https://www.dbs724.com/133618.html Linux gcore 是一种在Linux系统中使用命令行工具捕获进程内存内容的方法。它允许程序员制定程序的一个内存快照,从而帮助他们了解在特定时刻,程序的内部状态是什么状态。 通过生成一个进程的Core文件(也称为“内存快照”或

[转帖]Redis性能之内部阻塞式操作及应对方法

文章目录 Redis实例都有哪些阻塞点和客户端交互的阻塞点集合的全量查询和聚合操作bigkey删除操作清空数据库 磁盘交互的阻塞点主从节点交互时的阻塞点切片集群实例交互时的阻塞点可以异步执行的阻塞点异步的子线程总结 Redis的网络IO和键值对读写都是由主线程完成的。 Redis实例都有哪些阻塞点