【发布时间】:2016-08-03 18:33:03
【问题描述】:
我听说 JIT 会自动内联小方法,例如 getter(它们大约有 5 个字节)。边界是什么?有JVM标志吗?
【问题讨论】:
标签: java jvm jit jvm-hotspot
我听说 JIT 会自动内联小方法,例如 getter(它们大约有 5 个字节)。边界是什么?有JVM标志吗?
【问题讨论】:
标签: java jvm jit jvm-hotspot
HotSpot JIT 内联策略相当复杂。它涉及许多启发式方法,如调用方方法大小、被调用方方法大小、IR 节点数、内联深度、调用数、调用站点数、抛出数、方法签名等。
访问器方法(getter/setter)和普通方法(字节码计数小于 6)会跳过一些限制。
相关源码大多在bytecodeInfo.cpp.
请参阅InlineTree::try_to_inline、should_inline、should_not_inline 函数。
控制内联的主要 JVM 标志是
-XX:MaxInlineLevel (maximum number of nested calls that are inlined)
-XX:MaxInlineSize (maximum bytecode size of a method to be inlined)
-XX:FreqInlineSize (maximum bytecode size of a frequent method to be inlined)
-XX:MaxTrivialSize (maximum bytecode size of a trivial method to be inlined)
-XX:MinInliningThreshold (min. invocation count a method needs to have to be inlined)
-XX:LiveNodeCountInliningCutoff (max number of live nodes in a method)
【讨论】:
https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm#BABGGHJE
MaxInlineSize
默认值:35
要内联的方法的最大字节码大小
请参阅文档Java HotSpot VM Options 了解 JDK 7 及更早版本。
【讨论】: