Что такое CompileThreshold, Tier2CompileThreshold, Tier3CompileThreshold и Tier4CompileThreshold?
HotSpot многоуровневая компиляция использует интерпретатор, пока порог invocations (для методов) или итераций (для циклов) не запускает компиляцию клиента с помощью self -profiling. Компиляция клиента используется до тех пор, пока другой порог вызовов или итераций не вызовет компиляцию сервера.
Печать флагов HotSpot показывает следующие значения флага с -XX: + TieredCompilation.
intx CompileThreshold = 10000 {pd product}
intx Tier2CompileThreshold = 0 {product}
intx Tier3CompileThreshold = 2000 {product}
intx Tier4CompileThreshold = 15000 {product}
Слишком много флагов только для компилятора клиента и сервера. Какие компиляторы контролируются этими флагами? Если не клиент и сервер, какова цель дополнительных компиляторов?
В этом случае игнорируются CompileThreshold и Tier2CompileThreshold? Что контролирует Tier3CompileThreshold при компиляции клиента? Что контролирует Tier4CompileThreshold при компиляции сервера?
Ответы
Ответ 1
Комментарии в advancedThresholdPolicy.hpp обсуждают различные уровни компилятора и пороговые значения. См. Этот файл для более глубокого обсуждения.
Система поддерживает 5 уровней выполнения:
- Уровень 0 - интерпретатор
- Уровень 1 - C1 с полной оптимизацией (без профилирования)
- Уровень 2 - C1 с счетчиками invocation и backedge
- Уровень 3 - C1 с полным профилированием (уровень 2 + MDO)
- Уровень 4 - C2
C1 - клиентский компилятор. C2 является компилятором сервера.
В общем случае компиляция идет: 0 → 3 → 4. Атипичные случаи используются на основе длин очереди C1 и C2. Уровень 2 используется, когда длина очереди С2 слишком велика, чтобы способ мог выполнять примерно на 30% быстрее, пока С2 не сможет обработать информацию профилирования. Если метод определяется как тривиальный, то он скомпилирован с уровнем 1, так как он будет генерировать тот же код, что и уровень 4.
Пороги динамически корректируются в зависимости от длины очередей C1 и C2.