在某些情况下,如果方法调用成为瓶颈,java将“内联”一个方法体以避免方法调用的开销。但是,我找不到任何阻止java这样做的信息。例如。我可以想象,如果该方法是非静态的或修改字段,那么这可能会阻止java内联方法体。
是否可以内联所有方法,或者我的代码中是否有某些元素会阻止java内联方法?
编辑:我不想要阻止它 - 我想知道是否有东西可以阻止它,所以我可以避免做那些事情。我正在考虑代码中的事物(修饰符,字段访问等),而不是jvm args。
答案 0 :(得分:3)
如果您的方法太大,或者方法已经内联太多次,那么您的方法就不会被内联。
是否可以内联所有方法,或者我的代码中是否有某些元素会阻止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}
值得注意的是:MaxInlineSize限制了内联的深度。一般情况下,这不值得增加,因为它会增加您的代码大小并减慢您的编程速度。 FrehInlineSize是最大的大小,甚至经常被称为方法的内联方法。我发现增加一点可以帮助一些程序。
MaxInlineSize
是一个小方法需要内联的字节数,即使它不经常被调用。
答案 1 :(得分:0)