HeadlinesBriefing favicon HeadlinesBriefing.com

JDK 28: Оптимизации классов значений (JEP 401)

Hacker News •
×

Этот пост обсуждает предварительные функции в JDK 28, в частности JEP 401, важный этап Valhalla, интегрированный как предварительная функция. Классы значений увеличивают способность передавать семантику программы и возможности оптимизации, доступные для JVM. Однако убеждение, что обычные классы обеспечивают производительность и классы значений не могут опуститься ниже, является необоснованным. Хорошо намеренная программа может заставить JVM конвертировать между выпрямленными и ссылочными представлениями при взаимодействии методов, что может отрицать преимущества. Главное преимущество оптимизации классов значений — отказ от идентичности, позволяя среде выполнения выбирать подходящие представления, выпрямлять значения для избежания преследования указателей и скаляризировать компоненты в регистрах или в стеке. Анализ утечки становится тривиальным без требования идентичности. Неизменяемость позволяет выпрямление; JEP 539, Строгая инициализация полей, позволяет JVM полагаться на то, что финальное поле инициализируется до того, как его включающий объект становится наблюдаемым. Поскольку такое поле не может быть обновлено позже, JVM может использовать неатомарную выпрямленную компоновку без риска разорванного присваивания. Изменяемые поля должны сохранять безразрывное присваивание. Если изменяемое поле содержит значение, слишком большое для атомарного выпрямленного обновления, JVM должна использовать ссылочную компоновку. Рассмотрите запись Four Longs с 32 байтами полезной нагрузки; слишком велико для атомарного выпрямленного обновления. Но в записи Envelope полезная нагрузка — это строго инициализированное финальное поле, позволяющее неатомарную выпрямленную компоновку. Если Envelope был бы изменяемым, компоновка возвращается к REGULAR для поддержания согласованности.