我正在运行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) 我正在尝试在Solaris机器上调试java进程的一些问题,但是运行jps不会返回任何输出.并且jstack给出错误'Permission denied'.该框是3个相同服务器集群的一部分,jps和jstack在其他2台服务器上运行良好.
我发现以下论坛帖子来自有同样问题但没有答案的人:http: //forums.sun.com/thread.jspa?threadID = 5422237
澄清运行bps和grep for java给出了所有java程序正确,但是jps没有给出任何东西(用'program'和'client'匿名来保护有罪):
program @ clientdelivery2 : ~/
-> bps auxww|grep java
program 3427 5.5 54.067742726649544 ? S Sep 25 1039:47 /usr/jdk/instances/jdk1.6.0_16/bin/amd64/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/app/client/program/tomcat/conf/logging.properties -Xmx6144m -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.endorsed.dirs=/app/client/program/tomcat/endorsed -classpath :/app/client/program/tomcat/bin/bootstrap.jar -Dcatalina.base=/app/client/program/tomcat -Dcatalina.home=/app/client/program/tomcat -Djava.io.tmpdir=/app/client/program/tomcat/temp org.apache.catalina.startup.Bootstrap start
program 29915 0.1 11.915252441467896 ? S 14:55:28 3:59 /usr/jdk/instances/jdk1.6.0_16/bin/amd64/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/app/clientclone/program/tomcat/conf/logging.properties -Xmx2g -XX:PermSize=128m -XX:MaxPermSize=512m -Dcom.sun.management.jmxremote -Djava.endorsed.dirs=/app/clientclone/program/tomcat/endorsed -classpath :/app/clientclone/program/tomcat/bin/bootstrap.jar -Dcatalina.base=/app/clientclone/program/tomcat -Dcatalina.home=/app/clientclone/program/tomcat -Djava.io.tmpdir=/app/clientclone/program/tomcat/temp org.apache.catalina.startup.Bootstrap start
program 1573 0.0 0.0 4760 1332 pts/5 S 17:05:24 0:00 grep --colour java
program …Run Code Online (Sandbox Code Playgroud) 构建我自己的探查器,我使用JVMTI API来构建本机库代理.可以使用add参数-agentlib与JVM一起启动此代理程序.此外还有Attach API,它允许将代理注入正在运行的JVM中.我想使用以下代码将此功能实现到我的探查器:
try {
String pid = VirtualMachine.list().get(0).id();
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgentLibrary("agent");
} catch (AgentLoadException e1) {
e1.printStackTrace();
} catch (AgentInitializationException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (AttachNotSupportedException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
它有什么作用?从所有可用的正在运行的虚拟机(VirtualMachine.list())中,我选择第一个,附加到它并尝试将我的代理加载到其中.可以在UNIX系统上找到名为libagent.so的代理,但在尝试加载代理时会引发以下异常:
com.sun.tools.attach.AttachNotSupportedException:
Unable to open socket file:
target process not responding or HotSpot VM not loaded.
Run Code Online (Sandbox Code Playgroud)
查看源代码,抛出此异常,因为它找不到名为的文件.java_pid<pid>.我没有在文档中找到有关此类文件的大量信息.我经常听说这种文件不再使用,但我正在运行Java 1.6.
我还尝试连接到其他JVM,事实上我保持这个附加过程是动态的,出于测试原因我只是尝试连接到任何JVM.
这是导致异常的代码,取自sun.tools.attach:LinuxVirtualMachine.java:
// Return the socket file for the given process.
// Checks working directory …Run Code Online (Sandbox Code Playgroud)