Як надійно взяти Java Heap Dumps?


9

Моя команда стикається з труднощами, коли намагається зайняти хороші відвали, викликані OutOfMemoryErrors. З конкретних причин ми зараз беремо звалища з jmap, викликаними з bash-скрипту, замість того, щоб використовувати прапор HeapDumpOnOutOfMemoryError. Ми використовуємо 64-бітний 1,6 JVM з розміром купи близько 3 ГБ. Наші звалища випадають 90% часу (здогадка).

Чи можемо щось зробити, щоб покращити шанси отримати чистий відвал, який ми можемо використати для усунення проблем із пам'яттю? Я читав, що jmap мав основні проблеми в Java 1.4, але ці питання слід в основному вирішувати зараз.


4
Я висуваю це питання для "найбільш ненавмисно огидного звучання".
фоеб

1
Так, я думав про те, щоб зробити це навмисно-огидно звучащим, але я тут новий і не знав, як громада сприйме це :).
karlcyr

Відповіді:


7

Яка ваша операційна система? (Я не можу додавати коментарі).

Для Solaris ми отримуємо кращі результати спочатку змушуючи дамп ядра ( gcore <pid>), а потім додаючи jmap до основного файлу дампа ( jmap -heap:format=b <path to java bin> <path to core>)

gcore- це утиліта * nix для створення зображення запущеної програми. Дивіться посилання .


спробував це з gdb на Linux, і він чудово працює.
Крістіан

який JDK має "gcore"? моє, Sun 32-бітний jdk для Linux 1.6.0.20 його не має.
djangofan

Відредаговано з уточненням gcore.
fglez

2

у нас є JSP, який запитує ManagementFactory.getThreadMXBean () і виробляє звіт. Може не бути корисним, коли додаток вийшов з ладу, але якщо ви опитуєте щохвилини або близько того, ви отримаєте уявлення про те, що відбувається.

Більше інформації тут.


2

ви можете контролювати свою програму через jmx ззовні. коли ви знаєте деякі показники, які вказують на майбутні OutOfMemory, ви можете запустити jmap запуск до того, як буде викинуто виняток.


Дякую Крістіану, чи швидше jmap буде надійним до того, як помилка буде видалена?
karlcyr

jmap все одно знадобиться деякий час, щоб отримати вам сміттєзвалище. але ви отримаєте повний heapdump до тих пір, поки ваш jvm / tomcat в основному несе відповідальність.
Крістіан

Я думаю, що найчистішим і найпростішим інструментом для цього є "Visual VM". Це може бути поза сферою, але зробити спеціальний плагін для VisualVM, який виявляє стан і приймає автоматичний дамп зсередини VisualVm, було б дивним IMHO.
djangofan

2

Дякую вам усім за ваші пропозиції.

Що ми робимо, це писати сценарій для активного моніторингу журналів збору сміття. З нашого досвіду, повний GC майже завжди передує OOM, тому наш сценарій виявляє цю подію, витончено видаляє сервер із пулу балансування навантаження та змушує скинути кучу. Це значно підвищило нашу ефективність.


2

Це досить старе запитання, але я дам відповідь з надією, що хтось може вважати це корисним.

jmap має опцію -F (сила). Це виявилося, що для мене це не так добре минуло. Якщо ви бажаєте скористатися параметром -F, я рекомендую вам також вказати каталог java.io.tmp як частину команди jmap. Виникла проблема з JVM версії 1.6.22, коли утиліта jmap не працювала належним чином через налаштування тимчасової каталоги.

Ви також можете спробувати взяти основний дамп через gdb. Після того, як у вас є ядро, jmap може перетворити серцевину в купу звалища.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.