Java 什么';s添加(E,Object[]elementData,int s)方法?

Java 什么';s添加(E,Object[]elementData,int s)方法?,java,arraylist,Java,Arraylist,我正在读这本书,我想知道这个方法 我读过它的描述,但有些部分我不明白 例如: 将方法字节码大小保持在35以下(默认值为-XX:MaxInlineSize), 这有助于在C1编译循环中调用add(E) 什么是“方法字节码” 为什么要控制在35以下 什么是C1编译循环 方法字节码大小是一个方法编译到的数目。粗略地说,一个方法越短,这个数字就越低 是HotSpot VM中的编译器之一。它的工作是将Java字节码编译为JVM实际执行的本机代码 “内联”意味着将直接调用的方法的代码放入调用本机代码中,而

我正在读这本书,我想知道这个方法

我读过它的描述,但有些部分我不明白

例如:

将方法字节码大小保持在35以下(默认值为-XX:MaxInlineSize), 这有助于在C1编译循环中调用add(E)

  • 什么是“方法字节码”
  • 为什么要控制在35以下
  • 什么是C1编译循环
方法字节码大小是一个方法编译到的数目。粗略地说,一个方法越短,这个数字就越低

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

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

默认情况下,C1编译器只内联足够小的方法(通过方法字节码大小度量)

提取该方法将
add(E)
方法的字节码大小保持在内联的默认阈值以下,从而使
add(E)
被内联的可能性更大(这反过来也允许该方法被内联)

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

这种优化在这里被认为是可以接受的原因可能有两个方面:

  • ArrayList.add
    将在几乎所有在Java和Java上运行的代码中大量执行
  • 类本身是随JVM一起提供的,因此您可以始终保证它是在针对其进行优化的JVM中执行的
  • 什么是“方法字节码”

    它是编译器为方法生成的字节码

    为什么要控制在35以下

    当方法代码小于35条指令时,hotspot JVM可以内联方法代码

    C1汇编


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

    您能在阅读此文章的地方添加链接吗?您在哪里看到此方法?Java代码被编译为字节码。可以将其视为JVM的机器代码指令。Hotspot JIT编译器在将字节码转换为实际机器代码时会进行一些优化。其中之一是内联小方法。显然,方法体中35字节的指令是一个重要的阈值。Hotspot有(或传统上有)两种操作模式,C1不需要很多时间,C2需要更多时间,但考虑了更多优化。感谢您的解释,Joachim!