当前位置: 首页 > 知识库问答 >
问题:

对于HotSpot JIT,“已经编译成一个大方法”是什么意思?

李奕
2023-03-14

我正在查看JIT热点编译器日志(-XX:PrintCompilation-XX:UnlockDiagnosticVMOptions-XX:PrintInline),以确保优化/编译了一个重要的/热门的方法。该方法显示:

已经编译成一个大方法

这是什么意思?JIT是否正确优化/内联了我的方法?

Oracle wiki的这一解释并没有让我得出任何结论:

已经编译成一个大方法:已经为从调用站点调用的方法编译了代码,并且为生成的代码大于InlineSmallCode

这是什么意思?这是否意味着我的代码已经优化/内联,或者热点现在正在跳过它,因为它是在其他地方编译的?


共有1个答案

邴星洲
2023-03-14

查看热点源代码(搜索“已编译为大方法”),很明显,如果内联的候选方法已编译为本机代码,并且本机代码大小超过阈值InlineSmallCode(这取决于平台,可以通过-XX:InlineSmallCode=n设置),则会出现此消息。因此,此消息不依赖于调用方。

正如您所评论的那样,方法a()有时是内联的,有时不是(消息“已经编译成一个大方法”),这是怎么回事?

一种可能的解释是a()调用另一个方法b(),优化运行如下:

  1. 对a()的调用是内联的
  2. 现在,a()本身已优化,并将调用内联到b(),使其本机代码大小大于内联SmallCode
  3. 随后对a()的调用不会内联

也许您可以根据内联日志检查这个理论。

 类似资料:
  • 这点我见过提过几次,但我不清楚是甚么意思。你什么时候为什么要这么做? 我知道接口是做什么的,但我不清楚这一点的事实使我认为我错过了正确使用它们。 如果你要做: 您可以使用任何实现的类?你什么时候需要这么做?我唯一能想到的是,如果您有一个方法,但您不确定会传递什么对象,除了它实现。我想不出你需要多长时间这样做一次。 另外,如何编写一个方法来接受一个实现接口的对象呢?有可能吗?

  • 问题内容: 我遇到了这段代码,我不退出这一行来理解它的含义或它在做什么。 我知道是什么还是什么,但是什么是? 问题答案: 这是构造函数重载: 您可以通过缺少返回类型来判断此代码​​是构造函数,而不是方法。这与在构造函数的第一行中调用以初始化扩展类非常相似。您应该在构造函数的第一行中调用(或的任何其他重载),从而避免构造函数代码重复。 您也可以看看这篇文章:Java中的构造方法重载-最佳实践

  • 问题内容: 在最近的问题中,我收到了一些建议,以讨论除JavaScript以外的其他方面,其中函数是“一流”对象。与其他对象相比,“一流”在这种情况下是什么意思? 问题答案: 在计算机科学中,如果将编程语言视为一类对象,则该编程语言可支持一类函数(或函数文字)。具体地说,这意味着该语言支持在程序执行期间构造新函数,将它们存储在数据结构中,将它们作为参数传递给其他函数以及将它们作为其他函数的值返回。

  • 主要内容:什么是编译器,什么是集成开发环境,选择哪种集成开发环境我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为 可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有 .exe 和 .com(其中 .exe 比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。 可执行程序的内部是一系列计算机指令和数据的集合,它们

  • 问题内容: 我正在Java 8中使用Completable futures,并且我想编写一种方法,该方法基于接收到的参数并行运行多个具有副作用的任务,然后返回其“组合” future(使用),或者什么都不做,然后返回已经完成的未来。 但是,返回一个: 创建已知的已经完成的未来的唯一方法是使用,它需要一个值: 返回一个已经用给定值完成的新CompletableFuture。 并且是无法实例化的,因此

  • 我在java 8中使用Completable futures,我想写一个方法,根据收到的参数,或者并行运行多个具有副作用的任务,然后返回它们的“组合”未来(使用),或者什么都不做,返回一个已经完成的未来。 但是,返回一个