Улучшения анализа экранирования и оптимизации распределения стека в JAVA 9 и более поздних версиях.

Являются ли правила оптимизации распределения стека менее строгими для HotSpot Java 9–13?

В Java 7 и Java 8 размещение объектов в стеке HotSpot (из-за оптимизации JVM, известной как замена скалярных объектов) возможно, но для достижения выделения мусора в стеке потоков необходимо выполнить ряд строгих ограничений.

Правила включения оптимизации распределения стека для Java 8 (HotSpot, OpenJDK 8) резюмируются в великолепном ответе на этот вопрос: Когда Hotspot может выделять объекты в стеке? и как для Java 7 здесь: Право на анализ выхода/распределение стека с Java 7

В этом вопросе я хотел бы узнать, каково текущее состояние оптимизации EA и распределения стека в более новой версии JDK? Существуют ли другие виртуальные машины Java (например, OpenJ9) с другими правилами?


person digital_infinity    schedule 26.09.2019    source источник
comment
Из связанного ответа: «Еще одна важная вещь, которую нужно знать, это то, что Hotspot фактически не реализует выделение объектов в стеке. Вместо этого он реализует скалярную замену…». Термин «распределение стека» вводит в заблуждение относительно фактической цели этой оптимизации. Таким образом, в последних JVM нет существенных изменений просто потому, что размещение объектов в стеке никогда не было целью.   -  person Holger    schedule 26.09.2019
comment
@Holger, да, я знаю, что это метод оптимизации JVM, а не встроенная функция языка. Возможно, когда в Java появятся ValueTypes, у нас появится возможность размещать сложные типы в стеке. Прочитав ваш комментарий, я добавляю слово явной оптимизации в заголовок вопроса.   -  person digital_infinity    schedule 26.09.2019
comment
Это не моя точка зрения. Hotspot выполняет скалярную замену, что позволяет обрабатывать поля временных объектов как локальные переменные, обеспечивая последующую оптимизацию, такую ​​как свертывание констант, частичное устранение избыточности, снижение надежности, устранение мертвого кода, выделение регистров и т. д. . Таким образом, значения полей могут оказаться в стеке, если они не удалены и не назначены регистру, но это не основная цель. Таким образом, скалярная замена не применяется к более широкому набору сценариев, потому что действительно имеют значение только те, которые допускают последующую оптимизацию кода.   -  person Holger    schedule 26.09.2019
comment
Но если во временный объект вложен другой объект (даже если он тоже временный), скалярная замена не работает в HotSpot JVM 8. Это отмечено в одном из ограничений в связанных вопросах.   -  person digital_infinity    schedule 26.09.2019
comment
Например, я хотел бы знать, улучшилось ли что-нибудь недавно в JVM с обнаружением EA, можно ли также сгладить вложенный временный объект с помощью скалярной замены.   -  person digital_infinity    schedule 27.09.2019
comment
@digital_infinity, конечно, вы можете попробовать с несколькими флагами на виртуальной машине и посмотреть результат. Но C2, где это происходит, очень старый компилятор, я сомневаюсь, что многое изменилось... Более интересно было бы попробовать C2 Graal.   -  person Eugene    schedule 30.09.2019