Подтвердить что ты не робот

Как найти поток Java, работающий в Linux с помощью ps -axl?

У меня работает JVM с двумя потоками. Можно ли увидеть эти запущенные потоки на моей ОС Linux с помощью ps -axl? Я пытаюсь выяснить, какой приоритет предоставляет ОС для моих потоков. Подробнее об этом другом вопросе здесь.

4b9b3361

Ответ 1

Используйте

jps -v

для поиска вашего java-процесса. Выходной сигнал:

3825 RemoteMavenServer -Djava.awt.headless=true -Xmx512m -Dfile.encoding=MacRoman
6172 AppMain -Didea.launcher.port=7533 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 10.app/bin -Dfile.encoding=UTF-8
6175 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/1.6.0_31-b04-411.jdk/Contents/Home -Xms8m

Затем используйте

jstack 6172

(6172 - это идентификатор вашего процесса), чтобы получить стек потоков внутри jvm. От него можно найти приоритет нити. Пример вывода:

.....
"main" **prio=5** tid=7ff255800800 nid=0x104bec000 waiting on condition [104beb000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at au.com.byr.Sample.main(Sample.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

..... 

Наслаждайтесь!

РЕДАКТИРОВАТЬ: Если приложение работает под другим пользователем, чем вы сами (типичный случай в производственной и других нелокальных средах), то jps/jstack следует запускать через sudo. Примеры:

sudo jps -v

sudo jstack 6172

Ответ 2

В Linux Sun/Oracle JVM реализует потоки Java, используя собственные потоки Linux, так что да, вы можете видеть их в выводе "ps". Любой поток, принадлежащий процессу java, представляет собой поток Java. Но вы не увидите имен потоков, поскольку они специфичны для Java, и ОС не знает о них.

В потоках Linux есть идентификаторы, но они просто цифры, а "ps axl" их не показывают. "ps -eLf", в столбце "LWP". ( "LWP" не подходит для "легкого процесса", что является другим именем для потока.) В Java метод Thread.getId() может возвращать номер LWP, который вы видите в выводе "ps -eLf", но я не уверен.

Ответ 3

Переключатель селектора ps(1) ps(1) попросит ps(1) показать потоки как процессы. (Что примерно так, как они реализованы в любом случае.)

См:

$ ps axl | wc -l
163
$ ps axlH | wc -l
325

По-видимому, сейчас у меня много потоковных процессов.

Ответ 4

  • найдите идентификаторы потоков по умолчанию с опцией H "on" и запишите потоки PID
  • создать дамп потока и найти стек вашего потока. В шестнадцатеричном формате есть PID.

Ответ 5

Вы можете сделать JNI-переход в собственный код, чтобы получить собственный TID, связанный с конкретным потоком Java. Затем используйте команды OS или procfs, которые другие предложили или даже лучше отправили данные о потоке обратно в Java.

Пример: собственный код

JNIEXPORT jlong JNICALL Java_nativeGetThreadId(JNIEnv * env, jobject obj) {
    jlong threadId;
    threadId = (jlong)gettid();
    return threadId;
}

Ответ 6

Если у вас установлен JDK, вы можете использовать инструмент jvisualvm, чтобы увидеть потоки (и выполнять многие другие операции, java process - см. память, быстрая проверка объектов и т.д.)

Ответ 7

Все описанные здесь методы отлично работают. Я также искал что-то подобное и наткнулся на это blog Тимура Ахмадеева. Надеюсь, это поможет.

Изменить:

Как я уже указывал программисты-программисты, ниже приводится резюме Тимура:

В системе на основе nux сначала сделайте

top -H

чтобы показать использование ЦП на основе потоков. Ищите пользователя как oracle и в команде как Java. Обратите внимание на PID для этого процесса, а затем запустите

top -H -p PID

Появится список, в котором отображаются все задачи, которые выполняет данный процесс (программа java). После этого нам нужно знать, какую задачу может выполнять каждый поток, для которого мы используем утилиту, которую предоставляет jdk, а именно jstack. В linux потоки Java (JVM HotSpot) сопоставляются с потоками ядра.

jstack -pid_of_the_thread

Чтобы сопоставить нить уровня ОС с потоком Java в дампе потока, нам нужно преобразовать собственный идентификатор потока из Linux в базу 16 и выполнить поиск "nid = $ID" в трассировке стека. Например, идентификатор потока 7601 равен 0x1db1, который может быть тем, который вы контролировали. Если вы хотите еще больше следить за тем, что поток может сделать в будущем, то есть отслеживать его поведение, просто напишите оболочку script, чтобы следить за изменениями. Надеюсь, это имеет смысл.