有什么可以阻止 java 内联方法吗?
Is there anything that will stop java inlining a method?
在某些情况下,如果方法调用成为瓶颈,java 将 "inline" 方法体以避免方法调用的开销。但是,我找不到任何有关阻止 java 执行此操作的信息。例如。我可以想象,如果方法是非静态的或修改字段,那么这可能会阻止 java 内联方法体。
是否可以内联所有方法,或者我的代码中是否有某些元素会阻止 java 内联方法?
编辑:我不是想要阻止它 - 我想了解是否有可以阻止它的东西,所以我可以避免做那些事情。我在考虑代码中的具体内容(修饰符、字段访问等),而不是 jvm args。
如果您的方法太大,或者已经内联太多次的方法,您的方法将不会被内联。
Can all methods be inlined, or are there certain elements of my code that would stop java from inlining a method?
有许多参数可以控制它。
$ java -XX:+PrintFlagsFinal -version | grep Inline
bool C1ProfileInlinedCalls = true {C1 product}
intx FreqInlineSize = 325 {pd product}
bool IncrementalInline = true {C2 product}
bool Inline = true {product}
ccstr InlineDataFile = {product}
intx InlineSmallCode = 2000 {pd product}
bool InlineSynchronizedMethods = true {C1 product}
intx MaxInlineLevel = 9 {product}
intx MaxInlineSize = 35 {product}
intx MaxRecursiveInlineLevel = 1 {product}
intx Tier23InlineeNotifyFreqLog = 20 {product}
bool UseInlineCaches = true {product}
bool UseOnlyInlinedBimorphic = true {C2 product}
注意:MaxInlineSize 限制了内联的深度。一般来说,这不值得增加,因为它会增加你的代码大小并减慢你的程序。 FrehInlineSize 是即使是频繁调用的方法也会被内联的最大大小。我发现稍微增加一点可以帮助某些程序。
MaxInlineSize
是一个小方法即使不经常调用也需要内联的字节数。
博客不错Julien's tech blog。这似乎列出:
减少内联的东西
- 大方法 - 确保每个方法都是正确的小方法。
- 无预热 - JIT 编译器在获得方法调用的统计信息之前不会内联。
在某些情况下,如果方法调用成为瓶颈,java 将 "inline" 方法体以避免方法调用的开销。但是,我找不到任何有关阻止 java 执行此操作的信息。例如。我可以想象,如果方法是非静态的或修改字段,那么这可能会阻止 java 内联方法体。
是否可以内联所有方法,或者我的代码中是否有某些元素会阻止 java 内联方法?
编辑:我不是想要阻止它 - 我想了解是否有可以阻止它的东西,所以我可以避免做那些事情。我在考虑代码中的具体内容(修饰符、字段访问等),而不是 jvm args。
如果您的方法太大,或者已经内联太多次的方法,您的方法将不会被内联。
Can all methods be inlined, or are there certain elements of my code that would stop java from inlining a method?
有许多参数可以控制它。
$ java -XX:+PrintFlagsFinal -version | grep Inline
bool C1ProfileInlinedCalls = true {C1 product}
intx FreqInlineSize = 325 {pd product}
bool IncrementalInline = true {C2 product}
bool Inline = true {product}
ccstr InlineDataFile = {product}
intx InlineSmallCode = 2000 {pd product}
bool InlineSynchronizedMethods = true {C1 product}
intx MaxInlineLevel = 9 {product}
intx MaxInlineSize = 35 {product}
intx MaxRecursiveInlineLevel = 1 {product}
intx Tier23InlineeNotifyFreqLog = 20 {product}
bool UseInlineCaches = true {product}
bool UseOnlyInlinedBimorphic = true {C2 product}
注意:MaxInlineSize 限制了内联的深度。一般来说,这不值得增加,因为它会增加你的代码大小并减慢你的程序。 FrehInlineSize 是即使是频繁调用的方法也会被内联的最大大小。我发现稍微增加一点可以帮助某些程序。
MaxInlineSize
是一个小方法即使不经常调用也需要内联的字节数。
博客不错Julien's tech blog。这似乎列出:
减少内联的东西
- 大方法 - 确保每个方法都是正确的小方法。
- 无预热 - JIT 编译器在获得方法调用的统计信息之前不会内联。