2013-08-03 89 views
1

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

Cmd的线:com.test.myapp

DALVIK线程: (互斥: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>(一个java.lang.VMThread) - >这是什么意思?它在等待还是活着?

+0

您使用的是运行Android 4.3的Nexus 7吗? –

回答

1

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

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

- 等待< 0x4268ed88>(一java.lang.VMThread)由TID = 20(便便

VMThreads理想地用于处理监控GC,几乎是平行的这方面举行那么我可以想想,对于你的情况,你的应用程序的某个组件试图获得一个锁,但无法执行,因为VMThread持有锁,尚未发布(可能是由于某些主要的GC操作),因此等待vmthread释放锁。

你可能想要检查你的主日志转储有gc活动记录,这可能会给你一个更好的图片,为什么gc会占用这个线程CPU时间非常多,然后应用程序分析可能会有所帮助。 Jus检查。