我们有一个WebLogic设置,它给我们带来了一些问题.
我们有一个名为HP BAC的监视工具,它可以帮助我们可视化服务器的状态,我们将此工具与Java Thread Dump实用程序联系起来,这样当线程数较少时,将捕获一个线程转储.
在某些情况下服务器进入低线程计数状态,我们不确定为什么,因为我们所有的努力通过线程转储特别是徒劳无功.
鉴于"现状",我们的线程转储捕获总是在后期/之后触发,并且永远不会捕获对我们的调查有用的线程转储.
我想看看你们其他人如何进行这样的监测工作?

我正在Android Studio中学习该工具,获取线程转储,如下所示:
我注意到每个线程的状态都不同,
我可以看到有runnable,sleeping,waiting。我深入线程堆栈,大多数这样的线程堆栈,
"<61> RxComputationScheduler-3@830064517520" daemon prio=5 waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2017)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1050)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
我很困惑,他们这样做都停止Object.wait,但线程的状态可以是runnable,sleeping,waiting?
这是另一个状态线程的堆栈。
RUNNABLE
<53> RxSchedulerPurge-1@830057651944" daemon prio=5 runnable
java.lang.Thread.State: RUNNABLE
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1062)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)</code>
Run Code Online (Sandbox Code Playgroud)
TIMED_WAITING …
我们最近在我们的生产环境中看到了一个 CPU 消耗高的问题,并且在调试时看到了一些奇怪的东西。当我执行“top -H”以查看每个线程 ID 的 CPU 统计信息时,我发现线程 X 消耗了大量 CPU。当我进行线程转储时,我看到这个线程 X 处于 BLOCKED 状态。这是什么意思,处于 BLOCKED 状态的线程可以消耗高 CPU 吗?我认为这可能是一个微不足道的问题,但我是调试性能问题和 JVM 的新手,不确定我在这里可能遗漏了什么。
我在这里使用Ubuntu(服务器版)在Tomcat6上运行了一个Java Web应用程序.1-3天之后,应用程序变得非常慢,所以我在重新启动tomcat之后创建了一个threaddump,当应用程序开始变慢时我创建了另一个:
重新启动后的Threaddump:
3天后的Threaddump(申请现在很慢):
从我发布的转储中,我可以看到有很多线程由于某种原因似乎没有终止.不幸的是,我不知道哪些(类名?)和原因.top在控制台上使用显示"VIRT"的值从~800(重新启动后)上升到超过4000(3天后).
我怎样才能更好地解释这些转储?我已经尝试将它们加载到TDA中,但这不起作用(TDA似乎没有将它们识别为转储).
也许有人已经在转储中看到发生了什么?
分析线程转储,我有许多线程正在等待锁定已经锁定的监视器.在下面的示例中,同时提取并锁定监视器0x000000044158d3d0.
关于这个案子的任何线索?
"ORB Run Thread" #124 prio=5 os_prio=0 tid=0x00007f16a81b6800
nid=0x76f3 in Object.wait() [0x00007f165eef2000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000044158d3d0> (a java.lang.Object)
at java.lang.Object.wait(Object.java:502)
at com.sun.corba.se.impl.orb.ORBImpl.run(ORBImpl.java:1238)
- locked <0x000000044158d3d0> (a java.lang.Object)
at org.wildfly.iiop.openjdk.service.CorbaORBService$ORBRunner.run(CorbaORBService.java:241)
at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud) 我有以下线程转储(见下文),我不确定我是否有死锁.
任何人都可以建议吗?
2013-03-22 08:52:59
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.7-b01 mixed mode):
"Attach Listener" daemon prio=10 tid=0x00007f68e8001000 nid=0x41bd waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"http-bio-8080-exec-10" daemon prio=10 tid=0x00007f68840a2800 nid=0x41b5 in Object.wait() [0x00007f690cc57000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007e8fc4650> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
at java.lang.Object.wait(Object.java:503)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1115)
- locked <0x00000007e8fc4650> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
at …Run Code Online (Sandbox Code Playgroud) thread-dump ×7
java ×3
android ×1
apm ×1
cpu-usage ×1
deadlock ×1
java-ee ×1
jvm ×1
performance ×1
spring-mvc ×1
thread-state ×1
tomcat ×1
visualvm ×1
weblogic ×1
wildfly ×1
wildfly-16 ×1