我正在运行Ubuntu服务器版,我想采取Tomcat的线程转储.
所以,我首先尝试找出哪个PID tomcat使用:
$ jps -l
5809 sun.tools.jps.Jps
Run Code Online (Sandbox Code Playgroud)
但它不在那里?
所以,我用了之后top发现了PID 5730.
然后我调用jstack来获取线程转储:
$ sudo jstack -l 5730
5730: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?:-(
我已经尝试按照Jstack中的描述导出CATALINA_TMPDIR,并且Jstat停止使用升级到JDK6u23但是没有改变任何东西:
$ export CATALINA_TMPDIR=/tmp
$ sudo /etc/init.d/tomcat6 restart
* Stopping Tomcat servlet engine tomcat6
...done.
* Starting Tomcat servlet engine tomcat6
...done.
$ sudo jstack -l 5934 // …Run Code Online (Sandbox Code Playgroud) 我使用32位Oracle Java 1.6.0在x86_64 CentOS 5.7上运行tomcat 5.5.
tomcat使用的JVM进程有6421 pid.Tomcat工作正常.
运行jstack时失败:
[root@mybox ~]# jstack 6421
6421: well-known file is not secure
Run Code Online (Sandbox Code Playgroud)
要获得任何合理的输出,我需要使用force选项:
[root@mybox ~]# jstack -F 6421
Attaching to process ID 6421, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
Deadlock Detection:
No deadlocks found.
(...)
Run Code Online (Sandbox Code Playgroud)
该问题是:
jstack强制选项,该命令何时/何时不起作用?提前致谢.
我正在尝试在我的java应用程序上运行jstack命令.应用程序相当大,在jboss AS中运行占用大约4GB的内存.操作系统是Windows Server 2003标准版.每次我收到错误"没有足够的存储空间来处理此命令".有足够的RAM,16GB和磁盘空间.那么,有什么想法吗?
我正在尝试诊断我正在使用的Java Web应用程序(Jenkins)没有响应的问题.如果我在jstack没有-F标志的情况下运行它不会给我任何东西,但是如果我将标志放入以强制进行线程转储,不仅我得到了结果,而且应用程序开始响应并继续进行,好像什么都没发生,直到它最终再次停止响应.
jstack -F标志会做什么会影响正在运行的JVM并导致无响应的应用程序再次开始响应?
我很难理解我从jstack获得的在Tomcat 6上运行的Spring MVC Web应用程序的线程转储(java 1.6.0_22,Linux).
我看到阻塞线程(导致其他线程等待)自己被阻塞,但是线程转储没有告诉我为什么或者他们正在等待哪个监视器.
例:
"TP-Processor75" daemon prio=10 tid=0x00007f3e88448800 nid=0x56f5 waiting for monitor entry [0x00000000472bc000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Class.initAnnotationsIfNecessary(Class.java:3067)
- locked <0x00007f3e9a0b3830> (a java.lang.Class for org.catapultframework.resource.ResourceObject)
at java.lang.Class.getAnnotation(Class.java:3029)
...
Run Code Online (Sandbox Code Playgroud)
即我错过了堆栈跟踪中的"等待锁定..."行.显然线程锁定了一个Class对象,但是我不明白为什么线程本身被阻塞了.
线程转储不包含任何死锁提示.
如何识别锁定监视器?
谢谢,奥利弗
我们最近从JDK6u20(Linux,32位和64位)升级到JDK6u23.从那时起,我们不能再使用jstack和jstat工具从运行过程中获取监控信息.如果我们切换回JDK6u20,一切正常.
我们正在运行Tomcat 6.根据此论坛帖子,其他人也有同样的问题:http: //forums.oracle.com/forums/thread.jspa?threadID = 2151967&tstart = 0
运行简单的普通Java进程并使用这些工具.
Jstack说:无法打开套接字文件:目标进程未响应或未加载HotSpot VM当目标进程没有响应时,可以使用-F选项.
Jstat说:找不到19799
使用Jps根本不显示正在运行的进程,所以我猜这个问题更多是JDK6u23和JDK6u24的一般性质.它有一个新的热点引擎.也许某些东西不能与Tomcat和Hotspot v19一起使用.
任何的想法?感谢帮助.
PS当然,我们将它作为同一个用户运行,我们没有更改任何其他内容.只有JDK.
在我最繁忙的生产安装中,有时我得到一个似乎陷入无限循环的单个线程.经过大量的研究和调试后,我还没弄清楚谁是罪魁祸首,但看起来应该是可能的.以下是血腥的细节:
目前的调试说明:
1)ps -eL 18975向我展示了Linux pid问题子线程,19269
$ps -eL | grep 18975
...
PID LWP TTY TIME CMD
18975 18994 ? 00:00:05 java
18975 19268 ? 00:00:00 java
18975 19269 ? 05:16:49 java
18975 19271 ? 00:01:22 java
18975 19273 ? 00:00:00 java
...
Run Code Online (Sandbox Code Playgroud)
2)jstack -l 18975表示没有死锁,jstack -m 18975不起作用
3)jstack -l 18975确实为我的所有线程(~400)提供了堆栈跟踪.示例线程堆栈(而不是问题):
"http-342.877.573.944-8080-360" daemon prio=10 tid=0x0000002adaba9c00 nid=0x754c in Object.wait() [0x00000000595bc000..0x00000000595bccb0]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on … 我想得到在jboss服务器上运行的我的Web应用程序的线程转储.
我找到了两个解决我问题的方法:
谁能向我解释这两种方法之间的区别?
提前致谢 !
我们在服务器上使用jstack来检测java应用程序是否正在陷入僵局.它不适用于我们的Linux服务器之一.我认为O/S版本是:
$cat /etc/issue.net
Red Hat Enterprise Linux Server release 5.6 (Tikanga)
Kernel \r on an \m
Run Code Online (Sandbox Code Playgroud)
在服务器上运行的Java版本:
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
当我尝试:
jstack 19114
Run Code Online (Sandbox Code Playgroud)
我明白了:
19114: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
Run Code Online (Sandbox Code Playgroud)
当我尝试:
jstack -F 19114
Run Code Online (Sandbox Code Playgroud)
我明白了:
Attaching to process ID 19114, please wait...
Debugger …Run Code Online (Sandbox Code Playgroud) 我在多线程程序中做了一些工作.我在JConsole中看到我仍然有2个非守护程序线程,但我无法确切知道哪个(线程总数超过30).Visual VM不提供此类信息.