У меня работает JVM с двумя потоками. Можно ли увидеть эти запущенные потоки на моей ОС Linux с помощью ps -axl? Я пытаюсь выяснить, какой приоритет предоставляет ОС для моих потоков. Подробнее об этом другом вопросе здесь.
Как найти поток Java, работающий в Linux с помощью ps -axl?
Ответ 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, чтобы следить за изменениями. Надеюсь, это имеет смысл.