Android dumpstate分析

时间:2013-08-03 08:54:41

标签: android logging dump crash-dumps

我试图在我的应用程序中调试一个问题。只有这个问题的可能性是我的线程可能已挂在某处(但它应该等待)..当仔细查看duumpstate日志时我注意到了日志

Cmd line:com.test.myapp

DALVIK THREADS: (互斥: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在转储状态日志中的含义是什么?这是当前活着的线程还是生存的线程+已经活着? 什么状态= S schedstat =(9170292 19258957 35)utm = 0 stm = 0 core = 0是什么意思?是暂停状态吗?  等待&lt; 0x4268ed88&gt; (java.lang.VMThread) - &gt;这是什么意思?它在等待和活着吗?

1 个答案:

答案 0 :(得分:1)

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

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

- 等待&lt; 0x4268ed88&gt; (一个java.lang.VMThread)由tid = 20持有(poo

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

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