我正在尝试调试应用程序中的问题。唯一可能的问题是我的线程可能挂在了某个地方(但是它应该在等待中)。仔细查看了duumpstate日志时,我注意到以下日志
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是什么意思?它是暂停状态吗?
等待(java.lang.VMThread)->这是什么意思?它在等待并且还活着吗?
最佳答案
根据日志,我能想到的唯一可能触发ANR的原因是:
据我所知,通常在Java中,每个线程都与2个组件相关联。一个是程序计数器,另一个是垃圾收集器。因此,每个线程都会在整个过程中进行gc监控。
-等待tid = 20(poo)持有的(java.lang.VMThread)
理想情况下,VMThreads几乎可以并行处理gc的监控。因此,对于您的情况,我能想到的是您的应用程序的某个组件正在尝试获取锁,但是由于VMThread持有该锁(尚未释放)(可能由于某些主要的GC操作)而无法执行,因此无法等待,因此正在等待vmthread释放锁。
您可能想要检查记录了gc活动的主日志转储,这可能使您更好地了解gc为什么如此占用此线程的CPU时间,然后进行应用程序性能分析可能会有所帮助。强制检查。