JEP 145: Cache Compiled Code
Кэширование скомпилированного кода
| Автор | Tom Rodriguez |
| Ответственный | Christian Thalinger |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Withdrawn |
| Компонент | hotspot / compiler |
| Обсуждение | hotspot dash compiler dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | M |
| Рецензенты | Vladimir Kozlov |
| Создан | 2014/08/29 17:43 |
| Обновлён | 2026/03/10 12:48 |
| Задача | 8056932 |
Аннотация
Сохранять скомпилированный машинный код, полученный при предыдущих запусках, и использовать его повторно, чтобы сократить время запуска больших Java-приложений.
Что не является целью
Явного или открытого механизма в виде библиотеки для сохранения и восстановления кода не будет. В основном это должен быть «чёрный ящик» для пользователя, хотя могут быть предусмотрены настройки размера и расположения кэша.
Критерии успеха
Сокращение времени запуска больших и сложных Java-приложений. Ограниченное влияние на пиковую производительность.
Мотивация
JIT-компиляторы работают быстро, но Java-программы могут быть настолько большими, что полный прогрев JVM занимает много времени. Кроме того, редко используемый код может так и не быть скомпилирован.
Описание
Первоначальная цель — сохранять скомпилированный код предыдущих запусков, чтобы последующие запуски могли использовать его повторно. В основном это должно быть незаметно для пользователей JVM. Вероятно, придётся предусмотреть настройки размера кэша и его расположения на диске.
Возможна синергия с готовящейся системой модулей: в управлении расположением кэша на диске и в проверке того, что код и классы по-прежнему соответствуют друг другу. Подробности этого ещё предстоит проработать.
Tiered Compilation вскоре станет режимом по умолчанию, и это немного усложняет задачу. При Tiered Compilation создаётся несколько разных версий машинного кода, поэтому, чтобы получить наибольшую выгоду, придётся хранить несколько копий.
Кроме того, серверный компилятор учитывает большой объём профилирующей информации, которая на практике может меняться от запуска к запуску, поэтому понадобится возможность возвращаться к локальной компиляции, если профили выглядят несогласованными.
Альтернативы
Обсуждалось сохранение профилей или решений о компиляции, но это никак не сокращает время, которое фактически тратится на компиляцию кода. Возможно, вместо этого можно сохранять копию низкоуровневого IR на очень позднем этапе, но это, по-видимому, не менее сложно.
Тестирование
Помимо обычных конфигураций, тестирование придётся проводить на JVM, выполняющих кэшированный код.
Риски и допущения
Возможно, повторное использование кода приведёт к тому, что будет использоваться несколько менее оптимальный код, и производительность снизится. Надеемся, этого удастся избежать, но между возможностью повторно использовать код и оптимальным кодом для каждого случая приходится искать компромисс.
Зависимости
На данный момент этот проект не зависит однозначно от проекта системы модулей, но по мере развития обоих проектов это может измениться.