1

我试图在我的应用程序中调试一个问题。唯一的问题可能是我的线程可能已经挂在某个地方(但它应该在等待)..当仔细查看 duumpstate 日志时,我注意到以下日志

命令行:com.test.myapp

达尔维克线程:(互斥体:tll=0 tsl=0 tscl=0 ghl=0)。. .

"pool-2-thread-1" prio=10 tid=20 WAIT
  | group="main" sCount=1 dsCount=0 obj=0x426986e0 self=0x5ae85520
  | sysTid=3211 nice=-8 sched=0/0 cgrp=apps handle=1520669672
  | state=S schedstat=( 9170292 19258957 35 ) utm=0 stm=0 core=0
  at java.lang.Object.wait(Native Method)
  - waiting on <0x4268ed88> (a java.lang.VMThread) held by tid=20 (pool-2-thread-1)
  at java.lang.Thread.parkFor(Thread.java:1231)
  at sun.misc.Unsafe.park(Unsafe.java:323)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
  at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1052)
  at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:780)
  at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)

上面的线指向我怀疑的线程。转储状态日志中的 DALVIK THREADS 是什么意思?那是当前活着的线程还是活着的线程+已经活着的线程?state=S schedstat=( 9170292 19258957 35 ) utm=0 stm=0 core=0 是什么意思?是暂停状态吗?等待 <0x4268ed88> (a java.lang.VMThread) --> 这是什么意思?它在等待和活着吗?

4

1 回答 1

1

根据日志,我能想到的可能触发 ANR 的唯一原因是:

据我所知,通常在 Java 中每个线程都与 2 个组件相关联。一个是程序计数器,另一个是垃圾收集器。所以每个线程都会有一个 gc 监视器在整个过程中发生。

- 等待tid=20 (poo) 持有的<0x4268ed88> (a java.lang.VMThread)

VMThreads 理想地用于处理监控 gc 的这一方面,几乎是并行的。因此,对于您的情况,我能想到的是,您的应用程序的某个组件正在尝试获取锁但无法获取,因为 VMThread 正在持有锁,尚未释放(可能是由于某些主要的 GC 操作),因此正在等待 vmthread释放锁。

您可能想检查记录了 gc 活动的主日志转储,这可能会让您更好地了解 gc 为何如此占用此线程 CPU 时间,然后应用程序分析可能会有所帮助。检查一下。

于 2013-08-22T11:05:47.830 回答