Может ли Java встроить большой метод, если большая его часть будет мертвым кодом на сайте вызовов? - PullRequest
0 голосов
/ 02 мая 2018

Я знаю, что один из критериев, который Java HotSpot использует для определения того, стоит ли указывать метод, - это насколько он большой. С одной стороны, это кажется разумным: если метод большой, встраивание приводит к раздуванию кода, и выполнение этого метода занимает так много времени, что издержки вызова становятся тривиальными. Проблема с этой логикой состоит в том, что может оказаться, что ПОСЛЕ того, как вы решите встроить, становится ясно, что для этого конкретного сайта вызова большая часть метода - мертвый код. Например, метод может быть гигантским оператором switch, но большинство сайтов вызовов вызывают метод с константой времени компиляции, так что на самом деле: встраивание является дешевым (не требует полного тела метода; минимальное увеличение кода) и эффективным (накладные расходы на вызов метода преобладают над фактической работой).

Есть ли у HotSpot какой-либо механизм, позволяющий использовать преимущества таких ситуаций и встроить метод в любом случае, или есть ли предел, за которым он отказывается даже рассматривать встраивание метода, даже если он будет иметь минимальный эффект разрастания кода?

1 Ответ

0 голосов
/ 03 мая 2018

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

Существуют жесткие ограничения, препятствующие встраиванию большого метода, в том числе:

  • -XX:FreqInlineSize=325 - максимальный размер в байтовых кодах вызываемого абонента, который должен быть встроен;
  • -XX:InlineSmallCode=2000 - не вставлять вызываемый объект, если он уже имеет скомпилированный код, по крайней мере, такого размера в байтах;
  • -XX:NodeCountInliningCutoff=18000 - прекратить встраивание, если парсер генерирует это количество IR-узлов;
  • -XX:DesiredMethodLimit=8000 - максимальный размер в байтовых кодах агрегатного метода после встраивания. Этот параметр не настраивается в сборках продукта HotSpot, но ограничение можно отключить с помощью -XX:-ClipInlining.

Существуют и другие ограничения, но, как вы уже видели, большой метод вряд ли может быть встроен, даже если -XX:+IncrementalInline включен по умолчанию.

...