Как создать дамп потока приложения Java Web Start - PullRequest
5 голосов
/ 18 сентября 2008

Можно ли получить дамп потока приложения Java Web Start? И если да, то как?

Было бы неплохо, если бы существовало простое решение, которое позволило бы не разработчику (клиенту) создать дамп потока. В качестве альтернативы, возможно ли создать дамп потока программно?

В Java Web Start Console я могу получить список потоков, нажав 't', но трассировки стека не включены.

Если для ответов требуются определенные версии Java, скажите, пожалуйста.

Ответы [ 5 ]

6 голосов
/ 18 сентября 2008

В консоли нажмите V вместо T:

t:   dump thread list
v:   dump thread stack

Это работает под JDK6. Не знаю о других.

В качестве альтернативы, в JDK5 (и, возможно, ранее) вы можете отправить полную трассировку стека всех потоков на стандартный выход:

Под Windows: введите ctrl-break в консоли Java.

Под Unix: kill -3 <java_process_id> (например, kill -3 5555). Это НЕ убьет ваше приложение.

Еще одна вещь: как говорят другие, вы можете получить стеки программно с помощью класса Thread, но следите за Thread.getAllStackTraces() до JDK6, поскольку есть утечка памяти.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434648

С уважением,

Скотти

2 голосов
/ 18 сентября 2008

Начиная с 1.5, вы можете использовать Thread.getAllStackTraces(), чтобы получить Map для итерации.

Идеальным выходом будет тот, который получен из Ctrl- \ (или Ctrl-Break или аналогичного), но, похоже, нет документированного способа создания этого. Если вы готовы ограничиться JVM от Sun (или, я полагаю, использовать рефлексию), вы можете покопаться в пакетах sun.* и посмотреть, появится ли что-нибудь интересное.

2 голосов
/ 18 сентября 2008

Последние JDK (к сожалению, не JRE) включают такие инструменты, как jstack, который делает такие вещи. JVM версии 5 включают расширения JMX для получения дампов потоков, статистики памяти и многого другого. Все Java-приложения, включая веб-приложения запуска, имеют эту функциональность.

Вам потребуется либо установить JDK, либо написать JMX-клиент, который делает то же самое. Посмотрите на http://java.sun.com/javase/6/docs/technotes/guides/management/, чтобы получить больше информации.

2 голосов
/ 18 сентября 2008

Попробуйте

StackTraceElement[] stack = Thread.currentThread().getStackTrace();

Затем вы можете выполнить итерацию по коллекции, чтобы показать самые интересные элементы стека x.

0 голосов
/ 18 сентября 2008

Начиная с Java 5 у вас есть метод getStackTrace () класса Thread. Для предыдущих версий вы можете сделать:

Thread.currentThread().dumpStack();

Это выведет трассировку стека в System.out

...