我的应用程序启动后,我正在运行十个AsyncTasks.有时,模拟器需要很长时间才能启动这些任务.发生这种情况时,我在log cat中看到以下消息:
D / dalvikvm(1983):threadid = 8:撤消后仍然暂停(sc = 1 dc = 1 s = Y)
当模拟器快速执行时,不会出现此消息.奇怪的是,这种行为今天没有任何修改就改变了.由于我已经向模拟器明确分配了512mb ram,它不再是非常慢~5min,现在~5s.在真实设备上,我从来没有执行过慢.
我想了解这个日志cat消息的含义.我知道具有指定id的线程在此状态下被挂起并且无法正常工作.但为什么?什么撤消? (sc = 1 dc = 1 s = Y)是什么意思?
解决方法
消息来自dvmSuspendSelf(),当调试器(通过JDWP线程)要求它们挂起时,线程调用.
它应该工作的方式是(“我们”是一个线程):
> JDWP要求我们暂停
>我们告诉它我们已经暂停并进入睡眠状态
>最终,调试器唤醒了我们,我们恢复了
当VM正在等待信号的条件变量时,将记录该消息,但由于某种原因,我们仍然标记为已暂停.代码说明:
/* * The condition was signaled but we're still suspended. This * can happen if the debugger lets go while a SIGQUIT thread * dump event is pending (assuming SignalCatcher was resumed for * just long enough to try to grab the thread-suspend lock). */
在这种情况下的期望是当信号到达时我们意外地被唤醒(例如,system_server认为有一个ANR,因为主线程没有响应,因为调试器已经暂停它),如果我们再次循环,调试器将得到一个有机会清理我们并让我们继续前进.
日志消息正在打印self-> suspendCount的值(我们被告知要暂停多少次),self-> dbgSuspendCount(这些挂起请求中有多少来自调试器,因此我们可以“撤消”所有那些如果调试器断开连接),以及self-> isSuspended布尔值.
请注意,“s = Y”标志在姜饼中消失了 – 线程悬挂的工作方式是changed.