2013-08-03 121 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檢查。