Хорошо, таким образом с помощью общих комментариев в качестве начальной точки я придумал эту глупую путаницу :-)...
{
sleep 5;
echo 'ehlo';
sleep 3;
echo 'MAIL FROM:<Test@test.com>';
sleep 3;
echo 'RCPT TO: <kyle@test_dest.com>';
sleep 3;
echo 'DATA';
sleep 3;
echo -e 'To:kyle@testdest.com\nMIME-Version: 1.0 (mime-construct 1.9)\nContent-Type: application/zip\nContent-Transfer-Encoding: base64\n\n';
dd if=/dev/urandom bs=4 count=10 2>/dev/null | openssl base64;
echo '.';
} | telnet mx1.testdest.com 25
Вы могли контролировать свое приложение через jmx с внешней стороны. когда Вы знаете некоторые метрики, которые указывают на предстоящий OutOfMemory, Вы могли инициировать jmap, выполненный, прежде чем исключение будет выдано.
Который является Вашей операционной системой? (Я не могу добавить комментарии).
Для Соляриса мы получаем лучшие результаты, сначала вызывая дамп ядра (gcore <pid>
) и затем присоединяя jmap в файл дампа ядра (jmap -heap:format=b <path to java bin> <path to core>
)
gcore
*, отклоняют утилиту для генерации изображения под управлением программы. См. ссылку.
Благодаря Вам всем для Ваших предложений.
Что мы волновали, выполнение пишет сценарий для активного контроля журналов сборки "мусора". По нашему опыту, последовательный Полный GC почти всегда предшествуют OOM, таким образом, наш сценарий обнаруживает это событие, корректно удаляет сервер из пула выравнивания нагрузки и вызывает дамп "кучи". Это значительно увеличило нашу эффективность.
Это довольно старый вопрос, но я дам ответ с надеждой, что кто-то сочтет это полезным.
jmap имеет параметр -F (принудительно). В прошлом для меня это не сработало. Если вы хотите использовать параметр -F, я бы рекомендовал вам также указать каталог java.io.tmp как часть команды jmap. Возникла проблема с JVM версии 1.6.22, когда утилита jmap не работала должным образом из-за настройки временного каталога.
Вы также можете попытаться получить дамп ядра через gdb. Когда у вас есть ядро, jmap может преобразовать его в дамп кучи.