是否可以获得Java Web Start应用程序的线程转储?如果是这样,怎么样?
如果有一个简单的解决方案,这将使非开发人员(客户)能够创建一个线程转储,这将是很好的.或者,是否可以通过编程方式创建线程转储?
在Java Web Start控制台中,我可以按't'获取线程列表,但不包括stacktraces.
如果答案需要某些Java版本,请说明.
使用JRockit,您可以通过任何方式获取完整的线程列表,所有这些方法都包含有关垃圾收集线程的信息:
1)向Thread
班级询问信息:
Thread.getAllStackTraces();
Run Code Online (Sandbox Code Playgroud)
2)ThreadGroup
用于获取该信息:
ThreadGroup root = Thread.currentThread().getThreadGroup();
while (root.getParent() != null) {
root = root.getParent();
}
Thread[] list = new Thread[root.activeCount() + 5];
root.enumerate(list, true);
Run Code Online (Sandbox Code Playgroud)
3)使用JMX获取列表:
ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean();
long[] tids = THREAD_MX_BEAN.getAllThreadIds();
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids);
Run Code Online (Sandbox Code Playgroud)
4)CTRL-BREAK
但是,使用Sun JVM - 至少是最近的Java 6版本 - 只有CTRL-BREAK似乎包括垃圾收集线程和VM Periodic Task线程.我发现监视GC线程使用的CPU非常有用,这样我的应用程序就可以检测并记录GC何时占用大部分CPU时间.如果没有此信息,您只知道GC何时超过某些设定的阈值.
如果我甚至可以找到GC线程的线程ID,那么JMX可能会提供我需要的其他信息(除非这些线程有不同之处).例如,使用方法:
long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);
Run Code Online (Sandbox Code Playgroud)
有谁知道如何 - 或者是否已知不可能 - 使用Sun JVM获取有关垃圾收集线程的信息?
如何从OpenVMS上正在运行的Java进程中检索线程转储?该过程不支持JMX.我正在寻找类似kill -QUIT
Unix或Ctrl+Break
Windows的东西.
编辑:我在这里找到了答案:http: //h18012.www1.hp.com/java/documentation/1.6.0/ivms/docs/user_guide.html#javaenable_sigquit_mailbox
我在大多数线程处于(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) 我知道在java中生成线程转储的以下方法:
这些方法对JVM的性能影响最小?
我有以下线程转储,它显示了两个线程都锁定在同一个对象上。我对它的真正含义感到困惑
"pool-1-thread-2" prio=10 tid=0x00007fd6dc106000 nid=0x5d15 in Object.wait() [0x00007fd6d2067000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007c3547770> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at test.TestDead$Foo.second(TestDead.java:22)
at test.TestDead$Foo.first(TestDead.java:14)
- locked <0x00000007c3547770> (a java.lang.Object)
at test.TestDead$2.run(TestDead.java:45)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Locked ownable synchronizers:
- <0x00000007c35519e8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"pool-1-thread-1" prio=10 tid=0x00007fd6dc104800 nid=0x5d14 in Object.wait() [0x00007fd6d2168000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007c3547770> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at test.TestDead$Foo.second(TestDead.java:22)
at test.TestDead$Foo.first(TestDead.java:14)
- …
Run Code Online (Sandbox Code Playgroud) 我有一个按钮删除现有的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) 我有一个执行程序负责消耗来自ArrayBlockingQueue的消息.
new ThreadPoolExecutor(1, 1, 0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1),
r -> {
return new Thread(r, "Request-Queue-Drainer");
});
Run Code Online (Sandbox Code Playgroud)
Request-Queue-Drainer线程处于WAITING状态(虽然任务正在提交给该线程).以下是线程转储.
Name: Request-Queue-Drainer
State: WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@5b4757a2
Total blocked: 0 Total waited: 8
Stack trace:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
线程处于等待状态的原因是什么?
使用 akka 框架应用程序修复 Java play 中的性能问题。基本上消费和处理来自队列的消息。并且在处理每条消息时大量使用外部服务 API。我在某些情况下遇到 CPU 负载问题,试图找到根本原因。这是 CPU ~100% 时主机之一的线程转储。
我看到很多带有 sun.misc.Unsafe.park 的阻塞线程,但没有看到任何应用程序代码信息。这些被阻塞的是在等待 IO 吗?你能给一些提示吗?谢谢
1032 BLOCKED
threads
Thread 34542 - threadId:Thread 34542 - state:BLOCKED
stackTrace:
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20, line=226 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=68, line=2082 (Compiled frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=122, line=1090 (Compiled frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1, line=807 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=156, line=1068 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1130 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=615 (Interpreted …
Run Code Online (Sandbox Code Playgroud) I am debugging a live environment and I have taken some thread dumps. I see that lot of thread are "waiting on condition"; but how can I know what that condition is?
The below is the snippet of real thread dump stack:
"Uploader-pool-job-create-ca2d264a-51b3-4fa3-8113-
f0f0aca47add-StreamThread-10-0_14" #140 daemon prio=5 os_prio=0
tid=0x00007f006002b800 nid=0x18b waiting on condition
[0x00007f004d9e1000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000002c20d4320> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) …
Run Code Online (Sandbox Code Playgroud) thread-dump ×10
java ×9
jstack ×2
jvm ×2
akka ×1
debugging ×1
jmx ×1
openvms ×1
performance ×1
threadpool ×1