Записать дамп кучи JVM на стандартный вывод

Мы используем следующие флаги JVM для запуска приложения Spring Boot внутри Docker (управляемого Kubernetes)

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -XX:+ExitOnOutofMemoryError 

Как и ожидалось, контейнер перезапускается при исключении OOM. Однако дамп кучи, созданный при выходе (в /tmp), больше недоступен, так как контейнер был перезапущен. Хотя мы можем сопоставить постоянный том, есть ли способ записать дамп кучи в STDOUT (поскольку мы уже собираем журналы из STDOUT)? Использование -XX:HeapDumpPath=/dev/stdout приводит к

*

Dumping heap to /dev/stdout ...
Unable to create /dev/stdout: File exists

*

Есть ли простой обходной путь, который мне здесь не хватает?


person Ananth    schedule 15.02.2018    source источник
comment
HeapDump™ в основном будет огромным (т. е. размер кучи, вероятно, не менее пары сотен МБ). Вы действительно хотите сбросить его, чтобы выделиться?   -  person D. Kovács    schedule 15.02.2018
comment
Я понимаю, что он может быть огромным. Но, как я уже упоминал, мы уже направляем содержимое STDOUT в нашу инфраструктуру ведения журналов, которая может обрабатывать то же самое.   -  person Ananth    schedule 16.02.2018


Ответы (1)


Лично я бы использовал Docker Volume для подключения к образу Docker и хранения там дампы памяти, которые, как указывалось ранее, могут быть большими в ГБ.

person senape    schedule 15.02.2018