Я видел это сообщение об исключении из стороннего приложения (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, когда она выдает это конкретное исключение?
Поделитесь полной трассировкой стека.
Забавная история, его не было в logstash-plain... потом мой коллега убил коробку 💨
Какая именно версия JDK?
Я добавил все эти детали в ОП.




Используя git clone https://github.com/openjdk/jdk.git, ища сообщение об ошибке и немного возвращаясь к сайту использования, вы попадаете в «деоптимизацию».
См. src/hotspot/share/runtime/deoptimization.cpp, где написано что-то вроде
Фактическое перераспределение ранее удаленных объектов происходит в realloc_objects,...
Еще один намек исходит от wiki.openjdk.org, где говорится:
Деоптимизация — это процесс замены оптимизированного кадра стека на неоптимизированный.
Обобщая это, я понимаю, что во время оптимизации объект может быть перемещен из кучи в стек или иным образом «устранен». Следовательно, когда «оптимизированный кадр стека» деоптимизируется, объекту требуется место в куче.
Таким образом, «использовать меньше кучи» / «выделять больше кучи», как предлагает ФП, выглядит как единственный способ улучшить ситуацию.
Обычно StringBuilder перераспределяет постоянно растущие строки (массивы символов). Возможно, это то, что вы испытываете. Но мои знания о реальной технической стороне равны нулю.