标签: thread-dump

如何创建Java Web Start应用程序的线程转储

是否可以获得Java Web Start应用程序的线程转储?如果是这样,怎么样?

如果有一个简单的解决方案,这将使非开发人员(客户)能够创建一个线程转储,这将是很好的.或者,是否可以通过编程方式创建线程转储?

在Java Web Start控制台中,我可以按't'获取线程列表,但不包括stacktraces.

如果答案需要某些Java版本,请说明.

java debugging multithreading thread-dump java-web-start

5
推荐指数
1
解决办法
7960
查看次数

使用最新的Sun JVM(1.6),是否可以获取GC线程信息?

使用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获取有关垃圾收集线程的信息?

java garbage-collection jmx thread-dump

5
推荐指数
1
解决办法
1303
查看次数

在OpenVMS上创建线程转储

如何从OpenVMS上正在运行的Java进程中检索线程转储?该过程不支持JMX.我正在寻找类似kill -QUITUnix或Ctrl+BreakWindows的东西.

编辑:我在这里找到了答案:http: //h18012.www1.hp.com/java/documentation/1.6.0/ivms/docs/user_guide.html#javaenable_sigquit_mailbox

java thread-dump openvms

5
推荐指数
1
解决办法
335
查看次数

当几乎所有线程都处于NATIVE状态时,ThreadDump问题

我在大多数线程处于(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 multithreading jstack thread-safety thread-dump

5
推荐指数
1
解决办法
5883
查看次数

哪种方法在java中生成线程转储最不突兀?

我知道在java中生成线程转储的以下方法:

  • 杀-3
  • jstack
  • 来自JVM内部的JMX
  • JMX遥控器
  • JPDA(远程)
  • JVMTI(C API)

这些方法对JVM的性能影响最小?

performance jvm thread-dump

5
推荐指数
2
解决办法
628
查看次数

多个线程如何“锁定”同一个对象(如线程转储所示)

我有以下线程转储,它显示了两个线程都锁定在同一个对象上。我对它的真正含义感到困惑

    "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)

java multithreading jvm thread-dump

5
推荐指数
1
解决办法
2158
查看次数

removeAll()处的线程转储

我有一个按钮删除现有的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)

java multithreading jstack thread-dump

5
推荐指数
0
解决办法
186
查看次数

什么可能是线程停在java.util.concurrent.ThreadPoolExecutor.getTask的原因

我有一个执行程序负责消耗来自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)

线程处于等待状态的原因是什么?

java multithreading thread-dump executorservice threadpool

5
推荐指数
1
解决办法
2837
查看次数

分析线程转储 - sun.misc.Unsafe.park 上有很多被阻塞的线程

使用 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)

java multithreading thread-dump akka playframework

5
推荐指数
1
解决办法
1万
查看次数

How to know the condition at which a thread is "waiting" for?

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)

java multithreading thread-dump

5
推荐指数
1
解决办法
357
查看次数