如何用ps -axlfind在Linux上运行的Java线程?

我有一个运行两个线程的JVM。 是否有可能在我的Linux操作系统上使用ps -axl来查看这些正在运行的线程? 我试图找出操作系统给我的线程的优先级。 有关这个其他问题的更多信息。

Solutions Collecting From Web of "如何用ps -axlfind在Linux上运行的Java线程?"

使用

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是你的进程的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) ..... 

请享用!

编辑:如果应用程序运行在不同的用户比你自己(生产和其他非本地环境的典型案例),然后jps / jstack应通过sudo运行。 例子:

 sudo jps -v sudo jstack 6172 

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

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

ps(1)线程选择器开关H将要求ps(1)将线程显示为进程。 (无论如何,这大致是如何实现的。)

看到:

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

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

  1. 用选项H“on”找到线程ID,并记下线程的PID
  2. 使线程转储,并找到你的线程的堆栈。 有十六进制格式的PID。

如果您安装了JDK,则可以使用名为jvisualvm的工具来查看线程(并执行许多与java进程相关的其他操作 – 查看内存,快速检查对象等)

您可以将JNI跳转到本机代码中以获取与特定Java线程关联的本机TID。 然后像其他人所建议的那样使用OS命令或procfs,或者甚至将线程的详细信息发回给Java。

例如:本地代码

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

这里提到的所有方法都可以正常工作。 我也在寻找类似的东西,并且遇到了Timur Akhmadeev的博客 。 我希望它有帮助。

编辑:

正如我曾经被其他程序员指出的那样,以下是帖木儿的帖子总结:

在* nux的系统上先做一个

 top -H 

以每个线程为基础向您显示CPU使用情况。 在Java中查找用户为oracle和命令。 注意这个过程的PID,然后运行

 top -H -p PID 

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

 jstack -pid_of_the_thread 

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