是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?
是否也可以获得列表中所有线程的Thread和Class对象?
我希望能够通过代码来实现。
是否有任何方法可以获得当前JVM中所有正在运行的线程的列表(包括不是由我的类启动的线程)?
是否也可以获得列表中所有线程的Thread和Class对象?
我希望能够通过代码来实现。
当前回答
是的,看一下如何获取线程列表。那页上有很多例子。
这是通过编程来实现的。如果你只是想在Linux上得到一个列表,至少你可以使用这个命令:
kill -3 processid
虚拟机将做一个线程转储到标准输出。
其他回答
您查看过jconsole吗?
这将列出为特定Java进程运行的所有线程。
可以从JDK bin文件夹启动jconsole。
你也可以通过在Windows中按Ctrl+Break或在Linux中发送kill pid——QUIT来获得所有线程的完整堆栈跟踪。
获取一个可迭代集:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
性能:0毫秒,12个线程(Azul JVM 16.0.1, Windows 10, Ryzen 5600X)。
在Groovy中,你可以调用私有方法
// Get a snapshot of the list of all threads
Thread[] threads = Thread.getThreads()
在Java中,只要安全管理器允许,就可以使用反射调用该方法。
要使用终端获取线程列表及其完整状态,您可以使用下面的命令:
jstack -l <PID>
>是在您的计算机上运行的进程的id。要获得java进程的进程id,可以简单地运行jps命令。
此外,您还可以在TDAs(线程转储分析器)(fastthread或spotify线程分析工具)中分析jstack生成的线程转储。
在java控制台中,点击Ctrl-Break。它将列出所有线程以及堆的一些信息。当然,这不会让您访问对象。但无论如何,它对调试都很有帮助。