我需要为使用Windows的客户端计算机上运行的JVM进程获取堆栈跟踪.
客户端安装了JRE,但没有安装JDK.
我想使用JStack,但它没有安装,我们无法在客户端的机器上安装JDK.我也尝试过使用来自Java Webstart会话的AdaptJ堆栈跟踪产品,但由于我们远程进入并且因为不是在指定PID处启动应用程序的会话而得到错误.
基本上我想要一种安装JStack而无需安装JDK的方法.
我有一个桌面Java/Swing应用程序,它通过Java Webstart部署(客户端在XP上使用Java 6u20).我收到了申请暂停用户的间歇性报告.我设法在挂起期间登录到这样的系统,发现没有绘制UI(就像EDT被阻止一样).
我用jstack列出了线程; 我没有看到任何关于输出的死锁的提及,因为我对jstack很新,我不确定我还应该寻找什么.
我必须编辑堆栈跟踪以使其适合stackoverflow限制,希望没有遗漏任何重要意义.
谢谢,
菲尔
Full thread dump Java HotSpot(TM) Client VM (16.3-b01 mixed mode, sharing):
"AWT-EventQueue-0" prio=6 tid=0x03e3f000 nid=0xe44 in Object.wait() [0x0516f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at java.awt.EventQueue.getNextEvent(Unknown Source)
- locked <0x1d4b91d8> (a java.awt.EventQueue)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
<SNIP>
Locked ownable synchronizers:
- None
"ServerThread" prio=6 tid=0x058f7c00 nid=0xa08 waiting for monitor entry [0x055be000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.check(Unknown Source)
- waiting to lock <0x1d485f80> (a com.sun.deploy.security.CPCallbackHandler$ParentCallback)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.access$1400(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 我可以使用jps列出正在运行的java进程,并使用jstack -l process_id来获取正在运行的java进程的堆栈信息.我想知道这个进程运行在哪个java版本上.有办法吗?我不必使用jstack工具.谢谢.
jstack -l 23819 2014-11-12 12:36:11全线程转储OpenJDK 64位服务器VM(23.25-b01混合模式):
"Attach Listener"守护进程prio = 10 tid = 0x000000000272f800 nid = 0x614b等待条件[0x0000000000000000] java.lang.Thread.State:RUNNABLE
锁定的可拥有同步器: - 无
Java 线程始终处于以下十种状态之一:
NEW: Just starting up, i.e., in process of being initialized.
NEW_TRANS: Corresponding transition state (not used, included for completness).
IN_NATIVE: Running in native code.
IN_NATIVE_TRANS: Corresponding transition state.
IN_VM: Running in VM.
IN_VM_TRANS: Corresponding transition state.
IN_JAVA: Running in Java or in stub code.
IN_JAVA_TRANS: Corresponding transition state (not used, included for completness).
BLOCKED: Blocked in vm.
BLOCKED_TRANS: Corresponding transition state.
Run Code Online (Sandbox Code Playgroud)
未使用的状态 ( UNINITIALIZED) 已从列表中省略。
虽然上面给出了状态的定义,但我正在寻找“经验法则”来解释正在运行的应用程序服务器的给定线程状态设置。并且,更具体地说:
假设一个实时应用程序服务器在不同时间点具有以下线程统计信息(使用jstack获得):
BLOCKED、 65IN_NATIVE直到昨天,jstack工作正常.今天,所有突然之间它给了我下面的例外,我不知道为什么:
$ sudo -u tomcat6 jstack -J-d64 -m 26385
Attaching to process ID 26385, please wait...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:118)
at sun.tools.jstack.JStack.main(JStack.java:84)
Caused by: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 20.1-b02. Target VM is 19.0-b09
at sun.jvm.hotspot.runtime.VM.checkVMVersion(VM.java:224)
at sun.jvm.hotspot.runtime.VM.<init>(VM.java:287)
at sun.jvm.hotspot.runtime.VM.initialize(VM.java:357)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:594)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:494)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:332)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
... 6 more
Run Code Online (Sandbox Code Playgroud)
有谁知道是什么导致了这个?我在Ubuntu服务器版上运行Tomcat6.
我在大多数线程处于(state = IN_NATIVE)状态的应用程序中进行了主机的线程转储。
在这些情况下,只有几个线程被阻塞:
Thread 31681: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)
- java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=156 (Interpreted frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=1987 (Compiled frame)
- java.util.concurrent.LinkedBlockingQueue.take() @bci=29, line=399 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=78, line=947 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=18, line=907 (Compiled frame)
- java.lang.Thread.run() @bci=11, line=662 (Interpreted frame)
Run Code Online (Sandbox Code Playgroud)
和
Thread 20966: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
- com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run() @bci=34, line=534 (Compiled frame)
Run Code Online (Sandbox Code Playgroud)
和
Thread 31682: (state = BLOCKED) …Run Code Online (Sandbox Code Playgroud) 我试图调查为什么我的jboss占用600%的CPU(在CentOS 5上运行).
我运行top -H并尝试将结果与jstack输出进行比较.大多数来自顶部的线程ID出现在jstack的输出中,但不幸的是,占用大部分CPU的线程没有列在那里.
因为输出很长,我只在这里列出它的一部分.
$top -b -n1 -H -p <jboss pid>
top - 08:04:58 up 73 days, 19:50, 1 user, load average: 5.72, 5.97, 5.95
Tasks: 128 total, 6 running, 122 sleeping, 0 stopped, 0 zombie
Cpu(s): 63.6%us, 1.7%sy, 0.0%ni, 34.2%id, 0.3%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32946160k total, 32545228k used, 400932k free, 86776k buffers
Swap: 34996216k total, 136k used, 34996080k free, 21577176k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND …Run Code Online (Sandbox Code Playgroud) 我正在尝试从WER在崩溃时采用的本机转储中提取Java堆转储:
jstack -m -l "c:\Program Files\Java\jre6\bin\java.exe" WER.tmp.hdmp
Run Code Online (Sandbox Code Playgroud)
但我得到以下异常:
Attaching to core c:\Users\xxx\Desktop\WER.tmp.hdmp from executable c:\Program Files\Java\jre6\bin\java.exe, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library names (jvm.dll, jvm_g.dll)
at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:389)
at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:104)
at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:565)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:494)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:348)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:169)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:118)
at sun.tools.jstack.JStack.main(JStack.java:84)
Debugger attached successfully.
jstack requires a java VM process/core!
Run Code Online (Sandbox Code Playgroud)
我仔细检查过:
如果我尝试使用jmap提取java堆转储,我会得到完全相同的错误.
有谁知道会出现什么问题?
在 Windows 7 上,我尝试通过执行命令从 Java 进程获取堆栈跟踪
jstack.exe -F xxx
来自另一个 Java 进程,其中 xxx 是目标进程的 PID。我收到错误
附加到进程时出错:Windbg 错误:WaitForEvent 失败!
知道为什么吗?
我有一个按钮删除现有的JPanel并添加新的JPanel.但是当我按下那个按钮时,我的程序会挂起.我使用jstack跟踪并发现程序卡在removeAll()
这些是相关的线程转储:
"AWT-EventQueue-0" prio=6 tid=0x000000000df7f000 nid=0x394 runnable [0x000000002752a000]
java.lang.Thread.State: RUNNABLE
at java.lang.Thread.holdsLock(Native Method)
at java.awt.Component.checkTreeLock(Component.java:1199)
at java.awt.Component.getOpaqueShape(Component.java:9804)
at java.awt.Container.getOpaqueShape(Container.java:4066)
at java.awt.Component.calculateCurrentShape(Component.java:9892)
at java.awt.Component.applyCurrentShape(Component.java:9925)
at java.awt.Container.recursiveApplyCurrentShape(Container.java:4132)
at java.awt.Container.recursiveApplyCurrentShape(Container.java:4111)
at java.awt.Component.applyCurrentShapeBelowMe(Component.java:9943)
at java.awt.Component.mixOnHiding(Component.java:10003)
- locked <0x0000000089600fd0> (a java.awt.Component$AWTTreeLock)
at java.awt.Container.mixOnHiding(Container.java:4265)
- locked <0x0000000089600fd0> (a java.awt.Component$AWTTreeLock)
at java.awt.Component.removeNotify(Component.java:7027)
- locked <0x0000000089600fd0> (a java.awt.Component$AWTTreeLock)
at java.awt.Container.removeNotify(Container.java:2816)
- locked <0x0000000089600fd0> (a java.awt.Component$AWTTreeLock)
at javax.swing.JComponent.removeNotify(JComponent.java:4771)
at java.awt.Container.removeNotify(Container.java:2800)
- locked <0x0000000089600fd0> (a java.awt.Component$AWTTreeLock)
at javax.swing.JComponent.removeNotify(JComponent.java:4771)
at java.awt.Container.removeNotify(Container.java:2800)
- locked <0x0000000089600fd0> (a java.awt.Component$AWTTreeLock)
at javax.swing.JComponent.removeNotify(JComponent.java:4771)
at java.awt.Container.removeNotify(Container.java:2800)
- …Run Code Online (Sandbox Code Playgroud) jstack ×10
java ×9
performance ×2
thread-dump ×2
centos ×1
crash-dumps ×1
jmap ×1
locking ×1
mixed-code ×1
stack-trace ×1
tomcat ×1
windows ×1