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