Повышение производительности Java Hotspot VM: многоуровневая компиляция

Многоуровневая компиляция, представленная в Java SE 7, обеспечивает скорость запуска клиентской виртуальной машины на виртуальной машине сервера. Без многоуровневой компиляции виртуальная машина сервера использует интерпретатор для сбора информации о методах профилирования, которая отправляется компилятору. При многоуровневой компиляции виртуальная машина сервера также использует клиентский компилятор для генерации скомпилированных версий методов, которые собирают информацию о профилировании. Скомпилированный код значительно быстрее, чем интерпретатор, и программа выполняется с большей производительностью на этапе профилирования. Зачастую запуск происходит быстрее, чем скорость запуска клиентской виртуальной машины, поскольку окончательный код, созданный серверным компилятором, может быть доступен на ранних этапах инициализации приложения. Многоуровневая компиляция также может обеспечить лучшую пиковую производительность по сравнению с обычной серверной виртуальной машиной, поскольку более быстрая фаза профилирования позволяет продлить период профилирования, что может привести к лучшей оптимизации.

Многоуровневая компиляция по умолчанию включена для виртуальной машины сервера. Поддерживается 64-битный режим и сжатый указатель на обычный объект. Вы можете отключить многоуровневую компиляцию, используя флаг -XX:-TieredCompilation с командой java.

Для размещения дополнительного кода профилирования, созданного при многоуровневой компиляции, размер кэша кода по умолчанию умножается на 5x. Для эффективной организации и управления большим пространством используется кэш-память сегментированного кода.

Кэш-память сегментированного кода

Кэш кода - это область памяти, где виртуальная машина Java хранит сгенерированный собственный код. Он организован как единая структура данных кучи поверх непрерывного куска памяти.

Вместо того, чтобы иметь одну кучу кода, кэш кода делится на сегменты, каждый из которых содержит скомпилированный код определенного типа. Эта сегментация обеспечивает лучший контроль за объемом памяти JVM, сокращает время сканирования скомпилированных методов, значительно уменьшает фрагментацию кэша кода и повышает производительность.

Кэш кода разделен на следующие три сегмента:

    • Non-метод
    • Эта куча кода (code heap) содержит Non-метод код, такой как буферы компилятора и интерпретатор байт-кода. Этот тип кода остается в кэше кода навсегда. Куча кода имеет фиксированный размер 3 МБ, а оставшийся кэш кода распределяется равномерно между профилированной и непрофилированной кучей кода.
    • -XX:NonMethodCodeHeapSize
    • Profiled (профилированный)
    • Эта куча кода (code heap) содержит слегка оптимизированные профилированные методы с коротким временем жизни.
    • -XX:ProfiledCodeHeapSize
    • Non-profiled (не-профилированный)
    • Эта куча кода (code heap) содержит полностью оптимизированные непрофилированные методы с потенциально долгим сроком службы.
    • -XX:NonProfiledCodeHeapSize

Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки