Что означает «неудачное перераспределение скалярно замененных объектов» в ошибке Java OOM?

Я видел это сообщение об исключении из стороннего приложения (logstash, fwiw)

java.lang.OutOfMemoryError: Java heap space: failed reallocation of scalar replaced objects

Кажется, не так уж много информации об этом конкретном варианте OutOfMemoryError, и мне интересно, есть ли что-нибудь, что стоит знать о том, как реагировать на этот вариант, кроме очевидного «использовать меньше кучи» / «выделить больше кучи» .

В то время Logstash обрабатывал избыточный вывод TRACE (около 10 событий в формате JSON в миллисекунду) и намеренно ограничивал кучу, которую, очевидно, мы рассмотрим возможность увеличения.

Вывод JDK --version:

openjdk 11.0.23 2024-04-16 LTS
OpenJDK Runtime Environment Corretto-11.0.23.9.1 (build 11.0.23+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.23.9.1 (build 11.0.23+9-LTS, mixed mode)

Но... что вообще означает «неудачное перераспределение скалярно замененных объектов»? Что происходит внутри JVM, когда она выдает это конкретное исключение?

Обычно StringBuilder перераспределяет постоянно растущие строки (массивы символов). Возможно, это то, что вы испытываете. Но мои знания о реальной технической стороне равны нулю.

Joop Eggen 11.06.2024 11:44

Поделитесь полной трассировкой стека.

aled 11.06.2024 11:56

Забавная история, его не было в logstash-plain... потом мой коллега убил коробку 💨

Simon Gibbs 11.06.2024 12:07

Какая именно версия JDK?

aled 11.06.2024 13:50

Я добавил все эти детали в ОП.

Simon Gibbs 11.06.2024 15:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя git clone https://github.com/openjdk/jdk.git, ища сообщение об ошибке и немного возвращаясь к сайту использования, вы попадаете в «деоптимизацию».

См. src/hotspot/share/runtime/deoptimization.cpp, где написано что-то вроде

Фактическое перераспределение ранее удаленных объектов происходит в realloc_objects,...

Еще один намек исходит от wiki.openjdk.org, где говорится:

Деоптимизация — это процесс замены оптимизированного кадра стека на неоптимизированный.

Обобщая это, я понимаю, что во время оптимизации объект может быть перемещен из кучи в стек или иным образом «устранен». Следовательно, когда «оптимизированный кадр стека» деоптимизируется, объекту требуется место в куче.

Таким образом, «использовать меньше кучи» / «выделять больше кучи», как предлагает ФП, выглядит как единственный способ улучшить ситуацию.

Другие вопросы по теме