Что контролируют CompileThreshold, Tier2CompileThreshold, Tier3CompileThreshold и Tier4CompileThreshold?

многоуровневая компиляция HotSpot использует интерпретатор до тех пор, пока порог вызовов (для методов) или итераций (для циклов) не инициирует компиляцию клиента с самопрофилированием. Компиляция клиента используется до тех пор, пока другой порог вызовов или итераций не инициирует компиляцию сервера.

Печать флагов HotSpot показывает следующие значения флагов с -XX:+TieredCompilation.

intx CompileThreshold      = 10000 {pd product}        
intx Tier2CompileThreshold = 0     {product}           
intx Tier3CompileThreshold = 2000  {product}           
intx Tier4CompileThreshold = 15000 {product}           

Слишком много флагов только для клиентского и серверного компилятора. Какие компиляторы контролируются этими флагами? Если не клиент и сервер, то для чего нужны дополнительные компиляторы?

Игнорируются ли CompileThreshold и Tier2CompileThreshold в этом случае? Что контролирует Tier3CompileThreshold при запуске клиентской компиляции? Что контролирует Tier4CompileThreshold при запуске серверной компиляции?


person Nathan    schedule 20.08.2013    source источник


Ответы (1)


Комментарии в advancedThresholdPolicy.hpp обсудить различные уровни компилятора и пороговые значения. См. этот файл для более глубокого обсуждения.

Система поддерживает 5 уровней исполнения:

  • Уровень 0 — интерпретатор
  • Уровень 1 — C1 с полной оптимизацией (без профилирования)
  • Уровень 2 — C1 со счетчиками вызовов и бэкграунда
  • Уровень 3 — C1 с полным профилированием (уровень 2 + MDO)
  • Уровень 4 – С2

C1 — клиентский компилятор. C2 — серверный компилятор.

В общем случае компиляция идет: 0 → 3 → 4. Используются нетипичные случаи, основанные на длинах очередей C1 и C2. Уровень 2 используется, когда длина очереди C2 слишком велика, поэтому метод может выполняться примерно на 30 % быстрее, пока C2 не сможет обработать информацию профилирования. Если метод считается тривиальным, то он компилируется с уровнем 1, поскольку он будет создавать тот же код, что и уровень 4.

Пороги динамически настраиваются в зависимости от длины очередей C1 и C2.

person Nathan    schedule 21.08.2013
comment
Что CompileThreshold делает со всем этим? - person jocull; 12.12.2019
comment
Этот источник утверждает, что CompileThreshold игнорируется при включении TieredCompilation: xmlandmore. blogspot.com/2014/08/ - person jocull; 12.12.2019
comment
Для будущих читателей: я считаю, что TieredCompileTaskTimeout — это фактор длины очереди, упомянутый выше. Я полагаю, регулируемое значение тайм-аута в миллисекундах (для задачи, находящейся в очереди потоков компилятора C1) - person jocull; 05.01.2020
comment
Также: Tier3DelayOn — это количество методов в очереди C2 на поток компилятора, после которого политика больше не выполняет переходы 0->3, а вместо этого выполняет переходы 0->2. Tier3DelayOff переключает исходное поведение обратно, когда количество методов в очереди C2 на поток компилятора падает ниже указанного количества. Гистерезис необходим, чтобы избежать дрожания. - person jocull; 05.01.2020