如何使用ps -axl查找在Linux上运行的Java线程?

Joh*_*ine 25 java linux multithreading

我有一个运行JVM有两个线程.是否可以使用ps -axl在我的Linux操作系统上看到这些正在运行的线程?我试图找出操作系统给我的线程的优先级.关于这个问题,其它更多信息在这里.

Pet*_*iuk 55

使用

jps -v
Run Code Online (Sandbox Code Playgroud)

用于查找您的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
Run Code Online (Sandbox Code Playgroud)

然后用

jstack 6172
Run Code Online (Sandbox Code Playgroud)

(6172是你的进程的id)来获取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)

..... 
Run Code Online (Sandbox Code Playgroud)

请享用!

编辑:如果应用程序在不同于您自己的用户下运行(生​​产和其他非本地环境的典型情况),则应通过sudo运行jps/jstack.例子:

sudo jps -v

sudo jstack 6172
Run Code Online (Sandbox Code Playgroud)


Wyz*_*a-- 8

在Linux上,Sun/Oracle JVM使用本机Linux线程实现Java线程,所以是的,您可以在"ps"输出中看到它们.属于java进程的任何线程都是Java线程.但是你不会看到线程的名称,因为那些是特定于Java的,操作系统不知道它们.

Linux线程确实有ID,但它们只是数字,"ps axl"不显示它们."ps -eLf"在"LWP"列中.("LWP"是"轻量级进程"的缩写,它是线程的另一个名称.)在Java中,该Thread.getId()方法可能返回您在"ps -eLf"输出中看到的LWP编号,但我不确定.

  • 你可以将它与`jstack`中的线程id相关联.您需要将十六进制转换为十进制. (2认同)
  • 来自jstack的'nid'值将匹配来自Linux ps输出的'tid'.您必须将十六进制值转换为十进制. (2认同)

rkr*_*akz 6

这里提到的所有方法都可以正常工作。我也在寻找类似的东西,并 偶然发现了Timur Akhmadeev的这个博客。希望对您有所帮助。

编辑:

正如其他程序员所指出的那样,以下是Timur帖子的摘要:

在基于* nux的系统上,首先执行

top -H
Run Code Online (Sandbox Code Playgroud)

显示每个线程的CPU使用率。在oracle中查找用户,在Java中查找命令。记下此过程的PID,然后运行

top -H -p PID
Run Code Online (Sandbox Code Playgroud)

这将弹出一个列表,显示该进程(java程序)当前正在执行的所有任务。之后,我们需要知道每个线程可能执行的任务,为此我们使用jdk提供的实用程序,即jstack。在linux中,Java(JVM HotSpot)线程被映射到kerner线程。

jstack -pid_of_the_thread
Run Code Online (Sandbox Code Playgroud)

要将OS级线程映射到线程转储中的Java线程,我们需要将本机线程ID从Linux转换为base 16,并在堆栈跟踪中搜索“ nid = $ ID”。例如,线程ID为7601,0x1db1可能是您正在监视的线程。如果您想进一步注意线程将来可能做什么,即跟踪其行为,只需编写一个Shell脚本来监视更改。希望这是有道理的。


sar*_*old 5

ps(1)线程选择器开关H会问ps(1),显示线程的进程。(无论如何,这大致是它们的实现方式。)

看:

$ ps axl | wc -l
163
$ ps axlH | wc -l
325
Run Code Online (Sandbox Code Playgroud)

显然我现在有很多线程正在运行。