OutOfMemoryError

Sep 22, 2020 15:30

Вопрос. Как можно бороться с OutOfMemoryError? Поставил ключи DXX:+HeapDumpOnOutOfMemoryError и -DXX:HeapDumpPath=D:\dumps, но дамп не создаётся. В hs_err_pid<>.log файле есть сообщение Failed to write core dump. В связи с этим вопросы:
1. Как можно использовать информацию из hs_err_pid<>.log файла ( Read more... )

Leave a comment

Comments 18

provokatorz September 22 2020, 17:19:58 UTC
Как говорится - держите нас в курсе. Ибо мы все экстрасенсы и знаем все ваши подробности по взгляду на ваш юзерпик.

Reply

m_f September 22 2020, 17:25:12 UTC
Я не прошу, чтобы мне рассказали, что сломалось. Я прошу объяснить, где смотреть.

Reply


pesec September 22 2020, 18:48:20 UTC
Попытайтесь поставить -Xmx и -Xms в одно и то же значение.
А памяти действительно хватает? Там же, кроме -Xmx и -Xss на каждый thread, и class cache и т.п. В общем, много overhead'а...

Reply

m_f September 22 2020, 18:51:48 UTC
В одно значение? Спасибо, попробую. Вероятно, не хватает, но нужно же знать чего сколько ставить. Для этого и нужен дамап кучи.

Reply

pesec September 22 2020, 18:56:54 UTC
В одно, чтоб флуктуаций не было. Может, действительно на машине в это время что-то большое запускается, а потом заканчивается.

К тому же, сразу после запуска можно посмотреть, сколько ресурсов осталось с большей точностью...

Reply


zinal September 22 2020, 18:58:55 UTC
Возможно, для записи дампа не хватает полномочий.
Попробуйте запускать проблемную программу с текущим каталогом, в который можете писать (и который лежит в файловой системе с достаточным объемом свободного пространства)

Reply

m_f September 22 2020, 19:08:04 UTC
Спасибо, уже убрал настройку HeapDumpPath, так что по идее оно в текущий каталог и будет писать.

Reply


pesec September 22 2020, 19:08:08 UTC
-DXX:HeapDumpPath= или всё же -XX:HeapDumpPath= ?

Reply

m_f September 22 2020, 19:22:17 UTC
-DXX:HeapDumpPath. Скопировал из настроек томката. В командной строке без D должно быть, конечно.

Reply


alishka September 23 2020, 06:41:24 UTC
Стектрэса не выдает OOM или сообщения об ошибке? Судя по тому что памяти свободной много там попытка создать массив превышающий оставшуюся память может быть. Десериализация мусора?

Reply

m_f September 23 2020, 09:35:02 UTC
Дампа кучи не создаёт. Разверните Вашу мысль, пожалуйста. Я пока не понимаю.

Reply

alishka September 23 2020, 17:35:42 UTC
А почему создается hs_err_pid файл у вас по OOM, по умолчанию такого не должно происходить или где-то стоит флаг -XX:+CrashOnOutOfMemoryError?
Если флага нет, то это похоже на jvm crash, а не на крэш приложения.

JVM вам может создать heap dump в котором записаны все объекты из jvm-кучи и которые потом можно проинспектировать в visualvm. А может создать core dump к которому под линуксом можно подключить gdb/что-то_под_win и посмотреть какие трэды где были и тп но в visualvm его уже не загрузить.

"Failed to write core dump" - это не про хип дамп а про core который имеет смысл смотреть если падает jvm или нативная библиотека.

Возвращаемся к heap dump, чтобы его получить нужно флаги -XX:HeapDumpPath=. -XX:+HeapDumpOnOutOfMemoryError без всяких "-D". Флаги -D это для приложения, флаги -X и -XX для jvm.

В stdout ваш процесс что-нибудь пишет? Например если сделать вот такое:

byte[] data = new byte[1<<30];

и массив больше кучи то в stdout/err оно должно написать:

java.lang.OutOfMemoryError: Java heap space ( ... )

Reply

m_f September 23 2020, 17:54:38 UTC
В логе (в stderr)пишет OutOfMemoryError. Про флаги понял, попробую убрать -D, спасибо.

Reply


Leave a comment

Up