add(E e,Object [] elementData,int s)方法有什么作用?

时间:2019-09-03 08:40:10

标签: java arraylist

我正在阅读source code of ArrayList class,并且想知道方法add(E e, Object[] elementData, int s)

我已经阅读了它的描述,但是我不理解其中的某些部分。

喜欢这些:

  

保持方法的字节码大小小于35(-XX:MaxInlineSize默认值),   当在C1编译的循环中调用add(E)时,这很有帮助。

  • 什么是“方法字节码”?
  • 为什么要保持在35岁以下?
  • 什么是C1编译循环?

2 个答案:

答案 0 :(得分:4)

“方法字节码大小”是方法编译到的JVM instructions的数目。粗略地说,方法越短,该数字就越低。

C1-compiler是HotSpot VM中的编译器之一。它的工作是将Java字节码编译为JVM实际执行的本机代码。

“内联”是指将直接被调用的方法的代码放入调用的本机代码中,而不是实际执行“跳转”指令。这有助于避免以较大的代码大小为代价的“跳转”指令的开销。

默认情况下,C1编译器仅内联足够小的方法(以方法字节码大小为单位)。

提取该方法可使add(E)方法的字节码大小保持在默认的内联阈值以下,从而使add(E)内联的可能性更大(这又使该方法可以内联)也有可能)。

总而言之,这是一个极端 JVM特定的优化,对于在通用代码中使用它通常是一个一个非常糟糕的主意

此处认为这种优化可以接受的原因可能有两个:

  1. ArrayList.add将在几乎所有在Java和Java上运行的代码中执行很多
  2. 该类本身随JVM一起提供,因此您始终可以确保使用针对其进行了优化的JVM执行该类。

答案 1 :(得分:0)

  

什么是“方法字节码”?

这是编译器为该方法生成的字节码。

  

为什么要保持在35岁以下?

当此代码少于35条指令时,热点JVM可以内联方法代码。

  

C1编译

是JVM中的编译器,可将字节码转换为本机代码。