我有一个运行两个线程的JVM。 是否有可能在我的Linux操作系统上使用ps -axl来查看这些正在运行的线程? 我试图找出操作系统给我的线程的优先级。 有关这个其他问题的更多信息。
使用
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
显然我有很多线程进程正在运行。
如果您安装了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脚本来监视变化。 希望这是有道理的。