有什么可以阻止java内联方法吗?

str*_*ger 2 java inline

在某些情况下,如果方法调用成为瓶颈,java 将“内联”方法体以避免方法调用的开销。但是,我找不到任何有关阻止 java 执行此操作的任何信息。例如,我可以想象,如果该方法是非静态的或修改字段,那么这可能会阻止 java 内联方法主体。

是否可以内联所有方法,或者我的代码中是否有某些元素会阻止 java 内联方法?

编辑:我想要阻止它-我想知道,如果有事情会阻止它,所以我避免做那些事情。我正在特别考虑代码中的事情(修饰符、字段访问等),而不是 jvm args。

Pet*_*rey 6

如果您的方法太大,或者已经内联了太多次,您的方法将不会被内联。

是否可以内联所有方法,或者我的代码中是否有某些元素会阻止 java 内联方法?

有许多参数可以控制这一点。

$ 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}
Run Code Online (Sandbox Code Playgroud)

注意:MaxInlineSize 限制了内联的深度。一般来说,这不值得增加,因为它会增加代码大小并减慢程序速度。FrehInlineSize 是即使频繁调用的方法也会被内联的最大尺寸。我发现稍微增加一点可以帮助某些程序。

MaxInlineSize是,小法必须被内联,即使它不是频繁调用的字节数。