我正在阅读source code of ArrayList class,并且想知道方法add(E e, Object[] elementData, int s)
。
我已经阅读了它的描述,但是我不理解其中的某些部分。
喜欢这些:
保持方法的字节码大小小于35(-XX:MaxInlineSize默认值), 当在C1编译的循环中调用add(E)时,这很有帮助。
答案 0 :(得分:4)
“方法字节码大小”是方法编译到的JVM instructions的数目。粗略地说,方法越短,该数字就越低。
C1-compiler是HotSpot VM中的编译器之一。它的工作是将Java字节码编译为JVM实际执行的本机代码。
“内联”是指将直接被调用的方法的代码放入调用的本机代码中,而不是实际执行“跳转”指令。这有助于避免以较大的代码大小为代价的“跳转”指令的开销。
默认情况下,C1编译器仅内联足够小的方法(以方法字节码大小为单位)。
提取该方法可使add(E)
方法的字节码大小保持在默认的内联阈值以下,从而使add(E)
内联的可能性更大(这又使该方法可以内联)也有可能)。
总而言之,这是一个极端 JVM特定的优化,对于在通用代码中使用它通常是一个一个非常糟糕的主意。
此处认为这种优化可以接受的原因可能有两个:
ArrayList.add
将在几乎所有在Java和Java上运行的代码中执行很多
答案 1 :(得分:0)
什么是“方法字节码”?
这是编译器为该方法生成的字节码。
为什么要保持在35岁以下?
当此代码少于35条指令时,热点JVM可以内联方法代码。
C1编译
是JVM中的编译器,可将字节码转换为本机代码。