我有一个java应用程序,它似乎被卡住了。我尝试了kill -3,但输出为空(它被重定向到文件,但什么也没有)。
我怎样才能看到它在做什么?
编辑:
我尝试了 jstack 但它崩溃了:
Linux # /usr/pkgs/java/1.6.0.25/bin/jstack -F -l 12666
Attaching to process ID 12666, please wait...
A fatal error has been detected by the Java Runtime Environment:
SIGSEGV (0xb) at pc=0xaf121777, pid=5423, tid=2937191328
JRE version: 6.0_25-b06
Java VM: Java HotSpot(TM) Server VM (20.0-b11 mixed mode linux-x86 )
Problematic frame:
C [libsaproc.so+0x1777] void+0x1777
...
编辑2:
这是 jvisualvm 崩溃:
Linux # /usr/pkgs/java/1.6.0.25/bin/jvisualvm
A fatal error has been detected by the Java Runtime Environment:
SIGSEGV (0xb) at pc=0xf36d0777, pid=18217, tid=4090493856
JRE version: 6.0_25-b06
Java VM: Java HotSpot(TM) Client VM (20.0-b11 mixed mode, sharing linux-x86 )
Problematic frame:
C [libsaproc.so+0x1777] void+0x1777
An error report file with more information is saved as:
/tmp/root/feeder_wa/coho_idc/logs/hs_err_pid18217.log
If you would like to submit a bug report, please visit:
http://java.sun.com/webapps/bugreport/crash.jsp
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.
/usr/pkgs/java/1.6.0.25/bin/../lib/visualvm//platform/lib/nbexec:第 539 行:18217 中止“/usr/pkgs/java/1.6.0.25/bin/java”- djdk.home="/usr/pkgs/java/1.6.0.25" -classpath "/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/boot.jar:/usr/pkgs/java/1.6 .0.25/lib/visualvm/platform/lib/org-openide-modules.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/org-openide-util-lookup.jar:/usr /pkgs/java/1.6.0.25/lib/visualvm/platform/lib/org-openide-util.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/locale/boot_ja.jar: /usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/locale/boot_zh_CN.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/locale/org-openide- module_ja.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/locale/org-openide-modules_zh_CN.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/ lib/locale/org-openide-util-lookup_ja.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/locale/org-openide-util-lookup_zh_CN.jar:/usr/pkgs/ java/1.6.0.25/lib/visualvm/platform/lib/locale/org-openide-util_ja.jar:/usr/pkgs/java/1.6.0.25/lib/visualvm/platform/lib/locale/org-openide-util_zh_CN .jar:/usr/pkgs/java/1.6.0.25/lib/dt.jar:/usr/pkgs/java/1.6.0.25/lib/tools.jar" -Dnetbeans.dirs="/usr/pkgs/java/ 1.6.0.25/bin/../lib/visualvm//visualvm:/usr/pkgs/java/1.6.0.25/bin/../lib/visualvm//profiler:" -Dnetbeans.home="/usr/pkgs /java/1.6.0.25/lib/visualvm/platform" '-client' '-Xms24m' '-Xmx256m' '-Dsun.jvmstat.perdata.syncWaitMs=10000' '-Dsun.java2d.noddraw=true' '-Dsun .java2d.d3d=false' -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="/root/.visualvm/6u23/var/log/heapdump.hprof" org.netbeans.Main --userdir "/root/.visualvm/6u23 ” “——品牌” “visualvm” 0<&0
尝试一下 VisuamVM,您可以在版本 6 之后的每个 JDK 中找到它,网址为
jdkInstallDir/bin/visualvm
。
我想你运气不好。有时,应用程序会进入死状态,无法通过任何东西、kill、jstack 或 jvisualvm 进行线程转储。
如果这种情况经常发生,则设置一个计划线程转储并可能设置 jmap -histo:live。您需要在应用程序变得无响应之前收集线程和内存转储。与文本文件相比,我更喜欢转储,因为您可以让脚本每半小时运行一次,不需要显示,并且可以通过 grep 等工具轻松处理。 Jvisualvm 非常适合查找内存泄漏的根本原因,但首先要确定您有一个,因为它会给您的应用程序带来压力并导致崩溃。
使用
kill -3 <PID>
执行转储不会在该命令的标准输出上输出线程转储,而是在 java 进程的标准输出上输出它。