Каков размер методов, которые JIT автоматически включает?

Я слышал, что JIT автоматически вставляет небольшие методы, такие как геттеры (они имеют около 5 байтов). Какая граница? Есть ли какой-нибудь флаг JVM?

2 ответа

Решение

Политика встраивания HotSpot JIT довольно сложна. Он включает в себя множество эвристик, таких как размер метода вызывающего абонента, размер метода вызываемого абонента, количество ИК-узлов, глубина вставки, количество вызовов, количество сайтов вызовов, число бросков, сигнатуры методов и т. Д.

Некоторые ограничения пропускаются для методов доступа (геттеры / сеттеры) и для тривиальных методов (количество байт-кодов меньше 6).

Связанный исходный код в основном находится в bytecodeInfo.cpp.
Увидеть InlineTree::try_to_inline, should_inline, should_not_inline функции.

Основные флаги JVM для управления встраиванием:

-XX:MaxInlineLevel (maximum number of nested calls that are inlined)
-XX:MaxInlineSize (maximum bytecode size of a method to be inlined)
-XX:FreqInlineSize (maximum bytecode size of a frequent method to be inlined)
-XX:MaxTrivialSize (maximum bytecode size of a trivial method to be inlined)
-XX:MinInliningThreshold (min. invocation count a method needs to have to be inlined)
-XX:LiveNodeCountInliningCutoff (max number of live nodes in a method)

https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm

MaxInlineSize

По умолчанию: 35

Максимальный размер байт-кода метода, который будет встроен

См. Документ Опции Java HotSpot VM для JDK 7 и более ранних выпусков.

Другие вопросы по тегам