Как мне создать дамп потока Java-приложения Web Start
-
01-07-2019 - |
Вопрос
Возможно ли получить дамп потока Java-приложения Web Start?И если да, то каким образом?
Было бы неплохо, если бы существовало простое решение, которое позволило бы не разработчику (заказчику) создавать дамп потока.В качестве альтернативы, возможно ли создать дамп потока программно?
В консоли Java Web Start я могу получить список потоков, нажав "t", но трассировки стека не включены.
Если для ответов требуются определенные версии java, пожалуйста, скажите об этом.
Решение
В консоли нажмите V, а не T:
t: dump thread list
v: dump thread stack
Это работает под управлением JDK6.Не знаю, как другие.
В качестве альтернативы, в JDK5 (и, возможно, более ранних версиях) вы можете отправить полную трассировку стека всех потоков в standard out:
Под Окнами: введите ctrl-break в консоли Java.
Под управлением Unix: kill -3 <java_process_id>
(например,убить -3 5555).Это НЕ убьет ваше приложение.
Еще одна вещь:Как говорят другие, вы можете получить стеки программно с помощью Thread
класс, но остерегайтесь Thread.getAllStackTraces()
до JDK6, поскольку произошла утечка памяти.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434648
С уважением,
скотти
Другие советы
Последние JDK (к сожалению, не JRES) включают в себя такие инструменты, как jstack, которые делают такие вещи.JVM начиная с версии 5 включают расширения JMX для получения дампов потоков, статистики памяти и многого другого.Все приложения Java, включая приложения Web Start, имеют доступ к этой функциональности.
Вам нужно будет либо установить JDK, либо написать JMX-клиент, который делает то же самое.Взгляните на http://java.sun.com/javase/6/docs/technotes/guides/management/ чтобы получить больше информации.
Начиная с версии 1.5, вы можете использовать Thread.getAllStackTraces()
чтобы получить Map
для повторения.
Идеальным результатом был бы результат, полученный с помощью Ctrl-\ (или Ctrl-Break или аналогичного), но, похоже, не существует документированного способа получения этого.Если вы готовы ограничить себя JVM от sun (или, я полагаю, использовать reflection), вы могли бы покопаться в sun.*
посылки и посмотреть, не появится ли что-нибудь интересное.
Попробуй
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
Затем вы можете выполнить итерацию по коллекции, чтобы показать верхние элементы стека x, которые вас интересуют.
Начиная с Java 5, у вас есть метод getStackTrace() класса Thread.Для предыдущих версий вы можете сделать:
Thread.currentThread().dumpStack();
Это выведет трассировку стека в System.out