java - add(E e, Object[] elementData, int s) 方法的用途是什么?

标签 java arraylist

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

我已阅读其说明,但我不明白其中的某些部分。

像这些:

keep method bytecode size under 35 (the -XX:MaxInlineSize default value), which helps when add(E) is called in a C1-compiled loop.

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

最佳答案

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

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

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

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

提取该方法可使 add(E) 方法的字节码大小低于内联的默认阈值,从而使 add(E) 更有可能被内联(这反过来也可能允许此方法被内联)。

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

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

  1. ArrayList.add 将在几乎所有在 Java 上运行的代码中执行很多
  2. 类本身随 JVM 一起提供,因此您始终可以保证它是通过正在优化的 JVM 执行的。

关于java - add(E e, Object[] elementData, int s) 方法的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57768010/

相关文章:

java - 与ArrayList相比,为什么我们不将线性搜索成本算作链表插入操作的前提瓶颈?

java - 搜索 ArrayList 对象

java - 轻量级消息总线库

java - 在对 Thread.currentThread(); 的方法调用中,Thread 指的是什么?和 Thread.sleep();?

Java通过jenkins获取主机名和其他环境变量

java - 将一个简单的查询转换为 hibernate

java - 如何编写程序根据数学运算顺序进行计算? ( java )

java - 在java web应用程序中哪里将arrayList类型变量定义为静态?

java - 在 Java 中使用三角括号内的 "extends"和类型 "T"

java - Java连接池关闭