以下のためのアドオン(E E、オブジェクト[]からelementData、int型の)方法は何ですか?

魏鼎・ウォン:

私は読んでいArrayListクラスのソースコードを、私はこの方法に疑問を抱いていますadd(E e, Object[] elementData, int s)

私はその説明を読んだが、私はそれのいくつかの部分を理解していません。

これらのように:

35下のサイズのバイトコードキープ法(-XX:MaxInlineSizeのデフォルト値)は、add(E)はC1-コンパイルループ内で呼び出されたときに役立ちます。

  • 「メソッドのバイトコード」とは何ですか?
  • なぜそれが35下に保持しなければなりませんか?
  • C1-コンパイルループとは何ですか?
ヨアヒム・ザウアー:

「メソッドのバイトコードのサイズ」の数であるJVMの命令その方法をコンパイルします。大雑把方法短く言えば、この数を減らします。

C1-コンパイラは、 HotSpot VMの中のコンパイラの一つです。その仕事は、実際にJVMによって実行されるネイティブコードにJavaバイトコードをコンパイルすることです。

代わりに、実際に「ジャンプ」命令を行うための呼び出しネイティブコードに直接呼び出されるメソッドのコードを入れて「インライン化」を意味します。これは、大きなコードサイズの費用で「ジャンプ」命令のオーバーヘッドを回避できます。

デフォルトではC1コンパイラは、(メソッドのバイトコードのサイズによって測定される)十分に小さい方法をインライン。

そのメソッドを抽出するのバイトコードサイズ保つadd(E)インライン化のためのデフォルトのしきい値以下の方法を、したがって、それははるかに可能性が高いことになりadd(E)、インライン化されている(これは、この方法は、潜在的に、うまくとしてインライン化することを可能にします)。

このすべてのすべてであり、非常に一般的だJVMの特定の最適化は非常に悪い考え、汎用コードで使用します。

最適化のこの種は、ここで許容できると判断された理由は、おそらく2倍です:

  1. ArrayList.add実行されますがたくさんのJava上で動作し、ほぼすべてのコードに
  2. あなたは常に、ために最適化されていることをJVMで実行されますことを保証できるように、クラス自体は、JVMが同梱されています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=315021&siteId=1