jstack is a really helpful utility that comes standard with most linux JDK versions. It allows you to generate java thread dumps in situations where kill -3 won't work. kill -3 (aka kill -QUIT) will dump a java process's threads to stderr — but this, of course, works only when you still have access to stderr. If you're running a java process as a daemon (like a jetty or tomcat or jboss etc server), stderr usually is inaccessible.
Fortunately, jstack allows you to generate thread dumps without needing to read stderr from the original java process. jstack will dump the threads to jstack's own stdout, which you can pipe to a file, or through a pager, or just send directly to your terminial. There a few tricks to using it, however, which don't seem to be documented anywhere:
1. Use the right jstack executable
jstack usually will work only if it came with the same exact JDK version as the target JVM process is running. Since a lot of servers end up having several different JVM versions installed on them, it's important to make sure that the version of jstack you're trying to use is the right one — the jstack executable at /usr/bin/jstack won't necessarily be correct. And since jstack doesn't accept a -version flag, it's pretty hard to tell which version /usr/bin/jstack actually is.
So the most reliable way to run jstack is from the bin directory of the JDK which you're using to run the target JVM process. On ubuntu, this usually will be a subdirectory of one of the JDKs in the /usr/lib/jvm directory (like /usr/lib/jvm/java-6-openjdk-amd64 for the 64-bit version of the java 6 JDK). In that case, you might run jstack like this (when the target JVM's process ID is 12345):
/usr/lib/jvm/java-6-openjdk-amd64/bin/jstack 12345
2. Run jstack as the same user as the target JVM
You need to run jstack as the same user as which the target JVM is running. For example, if you're running jetty as a user named jetty, (and the jetty process ID is 12345) use sudo to execute jstack as the jetty user:
sudo -u jetty jstack 12345
(I learned this trick from Michael Moser's jstack - the missing manual blog post — apparently jstack uses a named pipe to communicate with the target JVM process, and that pipe's permissions allow only the user who created the target JVM process to read or write the pipe.)
3. Try, try again
Sometimes, even if you do those first two things, jstack will still tell you to go get bent (or some other inscrutable error message of similar intent). I've found that if I just try running it again a couple of times, jstack magically will work on the second or third try.
4. Don't use -F
Even though jstack sometimes itself will suggest that you try -F (particularly if you've got a version mismatch between jstack and the target JVM), resist the temptation to "force" it. When you use jstack with the -F option, jstack will actually stop the target process (ie kill -STOP). Only use the -F option if your app is already good and hung (because it certainly will be once you use -F).
Posted by Justin Ludwig at 11:21 AM
Labels: daemon, debug, java, jstack, linux, threads
No comments:
Post a Comment
摘自: http://blog.swwomm.com/2013/10/java-thread-dumps-for-daemons-with.html
分享到:
相关推荐
抓取jstack方法及解决system用户执行jstack命令权限问题, 打开cmd窗口,输入命令 jstack -l 49824>>C:/error01.txt 其中49824为tomcat8.0 的pid ; error01.txt 这个可以自己取名字 多输出几份jstack 文件,做比对...
本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的基本格式如下: ``` jstack [-l] [-F] pid ``` 其中,`pid` 是Java进程的ID,`-l` 选项会提供更详细的线程和锁信息,而 `-F` 选项则用于在...
本文将详细介绍`JStack`的使用方法及其在分析Java线程堆栈中的应用。 #### 二、JStack简介 `JStack`是Java Development Kit (JDK)的一部分,用于生成正在运行的Java应用程序的线程快照。这些快照提供了关于每个...
“threadump”即线程转储,是JVM在特定时刻对所有活动线程的堆栈跟踪记录,它包含了每个线程正在执行的方法、线程状态等信息,是排查多线程问题的重要手段。 “jvm”代表Java虚拟机,是Java程序运行的平台,它负责...
1. 线程的完整堆栈跟踪,包括本地方法。 2. 显示每个Java线程的状态,例如等待、运行、阻塞等。 3. 显示守护线程和非守护线程。 4. 显示Java和本机锁的锁定情况。 使用jstack获取线程堆栈信息的基本步骤如下: ...
本文将详细介绍使用 jstack 工具定位分析 CPU 消耗问题的步骤和方法。 问题现象描述 在本例中,个人银行用户开户调用短信验证接口时,当大于 20 用户并发时,usercenter 服务的 CPU 使用率超过 100%。这表明存在...
1. 不正确的同步策略:线程没有正确地使用`synchronized`关键字来保护共享资源。 2. 非阻塞I/O操作:如使用`System.out.println()`时,如果输出被缓冲,可能在不同线程间引起竞争。 3. 第三方库问题:log4j的配置或...
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...
- 使用`jstack`配合`jconsole`、`VisualVM`等工具定期收集Thread Dump,分析趋势,找出异常行为。 - 优化同步策略,减少不必要的锁竞争,考虑使用`ReentrantLock`、`Semaphore`等高级同步工具,或使用并发集合类。...
使用jstack时,它会向目标Java进程发送一个请求,以获取当前所有线程的堆栈跟踪信息。输出结果通常包括线程ID、线程状态、执行堆栈的类名、方法名、字节码索引和行号。这对于开发者和运维人员来说,都是理解和解决...
`jstack`命令的基本使用方式是:`jstack <pid>`,其中`<pid>`是Java进程的ID。执行这个命令后,你会看到一系列的线程堆栈跟踪,每个跟踪都展示了线程从启动到当前时刻执行过的每一个方法调用,这有助于追踪线程的...
通过运行`jstack`命令,你可以获取到进程的线程快照,其中包括每个线程的堆栈轨迹,这样就能看到哪些线程正在执行哪些方法,从而分析出可能的问题源。例如,你可能会发现某个线程卡在了某个阻塞操作上,或者发现了...
一旦找到死锁的代码位置,解决问题的方法取决于死锁的原因,可能需要调整代码逻辑,比如改变锁的申请顺序,减少对资源的争用,或者使用超时机制避免无限期等待。 总的来说,jstack是一款非常有用的工具,能够帮助...
例如,在jstack的输出中,可以看到两个线程“Thread-0”和“Thread-1”分别在等待“DeadLockDemo.java”文件中的某两行代码释放锁。 为了避免一次dump信息不足以确定问题,建议多次执行dump,最好是在不同的时间点...
1. **jps (Java Process Status)**: 用于查看运行在本地机器上的Java进程ID,这对于其他命令来说是必需的输入。通过添加参数`-l`,可以显示主类的完整包路径,而`-v`参数会展示JVM启动时的参数。在Windows环境下,...
Java线程转储分析器 这是用Java编写的Java... 有关用法的其他信息,请参见 。 执照 Java Thread Dump Analyzer是根据。 版权所有2014-2016 Spotify AB 版权所有2016-2018 MP Objects BV 版权所有2020 jstack.review
Jstack是Java开发工具包(JDK)中自带的一个命令行工具,它用于生成Java虚拟机(JVM)当前时刻的线程快照。...掌握Jstack的使用方法,对于解决Java应用中的线程问题、提高应用的稳定性和性能有着重要的意义。
3. **记录线程状态**:再次使用`jstack`命令,将信息输出到文件,如`jstack 进程ID > deadlock.txt`。 4. **查找死锁线索**:分析`deadlock.txt`文件,寻找“死锁”相关的提示。`jstack`会识别出死锁并显示死锁链,...
一、使用方法 1.使用java -jar启动程序 2.找到需要分析的jvm进程 3.使用jstack [pid] > /tmp/sdapjvmlog.txt导出进程的详细日志 4.使用程序打开导出的进程日志 二、此工具线程的几种状态 1.死锁,Deadlock...